Asp.net LINQ groupby и orderBy по датам не получает ожидаемый результат - PullRequest
2 голосов
/ 29 июля 2011

Я работаю над приложением asp.net mvc3 с linq2sql.

У меня есть список типов объектов SiteLog, содержащий также для каждого объекта: строку с именем CLRExceptionType и дату с именем EntryDate.Этот список включен в словарь:

private Dictionary<string, List<SiteLog>> dataBaseList = new Dictionary<string, List<SiteLog>>();
DataClasses1DataContext db = new DataClasses1DataContext("string1");
DataClasses1DataContext db2 = new DataClasses1DataContext("string2");

И я заполняю словарь в том же контроллере в функции:

   private void CreateDictionary()
{   
    dataBaseList.Add("db", db.SiteLogs.ToList());
    dataBaseList.Add("db2", db2.SiteLogs.ToList());
}

Затем у меня есть этот запрос Linq:

var result =
dataBaseList.GroupBy(x => x.Key)
          .SelectMany(x =>
                        x.SelectMany(n => n.Value
                                           .GroupBy(g => g.CLRExceptionType)
                                           .Select(g => new
                                                        {
                                                          DB = x.Key,
                                                          Exception = g.Key,
                                                          Count = g.Count(), 
                                                          LastOccured = 
                                                           g.Max(y =>
                                                                 y.EntryDate)
                                                        })))
          .OrderBy(x => x.DB)
          .ThenByDescending(x => x.LastOccured);

Это должно дать мне следующий вывод:

База данных1:
Исключение 1 (22 раза), в последний раз произошло: 22.10.1989 19: 30
Исключение2 (2 раза), последнийпроизошло 20.5.1980 14.50

База данных2
Исключение 1 (22 раза) Последнее появление: 21.10.1989 19: 30
Исключение2 (2 раза) последнее произошло 20.5.1980 14.50

Затем, внезапно, список обновляется новой записью в базе данных2, поэтому мне нужно поместить эту базу данных сверху:
База данных2
Исключение 1 (1 раз), когда последнее произошло: 29.07.2011 12.00
Исключение1 (22раз) в последний раз произошло: 21.10.1989 19: 30
Последнее исключение2 (2 раза) произошло 20.5.1980 14.50

База данных1:
Последнее исключение 1 (22 раза) произошло: 22.10.1989 19:30
Exception2 (2 раза) в последний раз произошло 20.5.1980 14.50

Так что, в принципе, я могу заказать журналы в базе данных по дате, но я не могу упорядочить базы данных по дате последнего появления, как я могу это решить?Viewcode (Index.cshtml):

<div id="results">

@{
    string firstTime = "";
}
 @foreach( var database in Model)
 {
       int currentCol = 0 ; 
        if (!(firstTime == database.DB))
        {
          <br style="clear:both" /><h3> @database.DB </h3>
                currentCol = 0;
        }

           <div class="logContainer" onclick="location.href='/logs/Details?databaseID=@database.DB&exceptionName=@database.Exception&exceptionsOccurred=@database.Count';">

                @if (database.Count > 999)
                {
                    <div class="counter-small"><b>@database.Count</b></div>
                }
                else
                { 
                <div class="counter"><b>@database.Count</b></div> 
                }
                <div class="exceptionName"> Exceptions of Type: @database.Exception</div>
                <div class="date">Siste: @database.LastOccurred</div>
         <hr />   </div>
     currentCol += 1;
          if (currentCol == 2) { //3 columns were displayed, switch row
    currentCol = 0;
    <br style="clear:both" />
}

     firstTime = database.DB; 
}

</div>

Tnx заранее

1 Ответ

0 голосов
/ 29 июля 2011

Один из подходов к этому - переключиться с L2SQL на L2Objects после того, как у вас есть данные, затем снова сгруппировать, чтобы вы могли отсортировать:

var result = dataBaseList.GroupBy(x => x.Key)
          .SelectMany(...)
          .AsEnumerable()
          .GroupBy(x => x.DB)
          .OrderByDescending(g => g.Max(x => x.LastOccured));

Это даст вам список групп с Key из DB в порядке последнего исключения групп.

Чтобы использовать эти результаты, вы должны использовать вложенные циклы foreach:

<div id="results">
  @foreach(var group in Model)
  {
    int currentCol = 0; 
    <br style="clear:both" />
    <h3> @group.Key </h3>

    @foreach(var database in group)
    {
      <div class="logContainer" onclick="location.href='/logs/Details?databaseID=@database.DB&exceptionName=@database.Exception&exceptionsOccurred=@database.Count';">

        @if (database.Count > 999)
        {
          <div class="counter-small"><b>@database.Count</b></div>
        }
        else
        { 
          <div class="counter"><b>@database.Count</b></div> 
        }
        <div class="exceptionName"> Exceptions of Type: @database.Exception</div>
        <div class="date">Siste: @database.LastOccurred</div>
        <hr />

      </div>

      currentCol += 1;
      if (currentCol == 2) { //3 columns were displayed, switch row
        currentCol = 0;
        <br style="clear:both" />
      }
    }
  }
</div>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...