【问题标题】:Asp.net LINQ groupby and orderBy on dates does not retrieve the expected output日期上的 Asp.net LINQ groupby 和 orderBy 未检索到预期的输出
【发布时间】:2011-07-30 04:03:58
【问题描述】:

我正在使用 linq2sql 开发一个 asp.net mvc3 应用程序。

我有一个 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:
Exception1(22 次)最后发生:22.10.1989 19:30
Exception2(2 次)最后发生于 20.5.1980 14.50

数据库2
Exception1(22 次)最后发生:21.10.1989 19:30
Exception2(2 次)最后一次发生在 20.5.1980 14.50

然后列表突然更新为数据库中的一个新条目,因此我必须将此数据库放在顶部:
数据库2
Exception1(1 次)最后发生:29.07.2011 12.00
Exception1(22 次)最后发生:21.10.1989 19:30
Exception2(2 次)最后发生于 20.5.1980 14.50

数据库1:
Exception1(22 次)最后发生:22.10.1989 19:30
Exception2(2 次)最后一次发生在 20.5.1980 14.50

所以基本上,我可以按日期对数据库中的日志进行排序,但我不能按最后一次发生的日期对数据库进行排序,我该如何解决这个问题? 查看代码(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>

提前发送

【问题讨论】:

    标签: c# asp.net sql linq asp.net-mvc-3


    【解决方案1】:

    解决此问题的一种方法是在获得数据后从 L2SQL 切换到 L2Objects,然后再次分组以便进行排序:

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

    这将为您提供KeyDB 的组列表,按组的最后一个例外的顺序排列。

    要使用这些结果,您可以使用嵌套的 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>
    

    【讨论】:

    • 实际上,如果没有AsEnumerable(),查询可能会工作,但我预计L2SQL 正确翻译会更加困难。
    • 我试过了,但在视图中出现了这个错误:Microsoft.CSharp.RuntimeBinder.RuntimeBinderException: 'object' does not contain a definition for 'DB' Line 20: if (!(firstTime == database .DB))
    • 是的,你需要改变你的观点,因为结果的结构正在改变。新结构可能更易于使用,因为它已经为您分组。看不懂的可以贴出视图代码。
    • 我发了,因为我有点迷茫
    • 它不起作用 :( 我在@Group.key 上遇到错误,如果我删除它,我没有收到任何错误,但结果显示不按顺序:\
    猜你喜欢
    • 2021-06-05
    • 2011-05-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-31
    • 2019-04-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多