回答

收藏

Asp.net LINQ groupby和orderBy在日期上未检索到预期的输出

技术问答 技术问答 218 人阅读 | 0 人回复 | 2023-09-12

我正在使用linq2sql处理asp.net mvc3应用程序。2 d% C" y8 t& l5 q  Q/ S  j
我有一个SiteLog对象类型列表还包括每个对象:一个名称CLRExceptionType字符串和一个名字EntryDate字典中包含此列表:' k, n, P8 f. l' Z& W
private Dictionary> dataBaseList = new Dictionary>();DataClasses1DataContext db = new DataClasses1DataContext("string1");DataClasses1DataContext db2 = new DataClasses1DataContext("string2");然后在函数中的同一控制器中填写词汇表:
. S4 P% ?5 r+ y! \3 @            private void CreateDictionary()()()()()()()(                 )()()()()()()()()()()()()()()()())())()())()())())()()()()())()())()()())())()()())()()()()()())()())())()())()())())())())()())()()()())())()())())()()))()()())())())())()()()))())()())()())()()())())())())())())())())()())())())()))()))()))()))())())()))())))())))))()))))()))()))())))())()))())))()))))())))()))))())))))()))))()))())))())))()))()))))()))()))()))))))()))))))())))()))))()))))()))))()))())))))()))))()))())))))()))))))))()()()))())))))))))())))))))))())))))))))())())()())()))())))))()))))()))))))))())))))))))())))))))))())))))())()))))dataBaseList.Add("db",db.SiteLogs.ToList();     dataBaseList.Add("db2",db2.SiteLogs.ToList());}然后我有这个Linq查询:
, W5 i+ v8 D% g1 {* rvar 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);那应该给我以下输出
+ c8 D+ v6 ?: ADatabase1:5 _' u" s' F( F  E0 q4 c
Exception1(22次)上次发生:22.22.1989 19:30; s# k, X: W  |( o% I
Exception2(2)20.5.1980 14.50    F5 d- p8 I8 H  D
Database25 }7 t" r/ V( L
Exception1(22次)上次发生:21.10.1989 19:30
' N: w; Q5 o" p* xException2(2)20.5 .1980 14.50  
$ S! B: n5 ]. l3 V3 t然后突然用数据库2中的新项目更新列表,所以我必须把这个数据库放在前面:$ g! C. R1 @7 F2 _: g& l+ T
数据库2
0 e; T( t+ k  f( XException1(1次)最后9 Z' d) j- [! d# n. ~0 f8 n
一次出现:29.07.2011 12.00 Exception1(22次)最后一次出现:21.10.1989 19:30
0 ]/ t1 o( U1 {' ^. r5 dException最后一次发生在20次(2次).5.1980 14.50  
$ g6 F( W# m- \6 G" }) j: g: A  F/ _Database1:
5 e1 y$ [7 ~8 tException最后一次发生在:22.10.1989 19:30
) C2 m& v" Q3 v: k& U0 u. {Exception最后一次发生在20次(2次).5.1980 14.50  
4 o5 I- Y8 A  B因此,基本上,我可以根据日期对数据库中的日志进行排序,但我不能根据数据库上的最后日期对数据库进行排序。如何解决这个问题?查看代码(Index.cshtml):
  w9 L, I$ f5 Y, V" q( Q  b3 a@{    string firstTime = "";} @foreach( var database in Model)          int currentCol = if (!(firstTime == database.DB))                    
# C6 ~7 x2 Q+ S# }! S( k& _ @database.DB                 currentCol = 0;                             @if (database.Count > 999)                                      @database.Count                                                         else                                   @database.Count                                                           Exceptions of Type: @database.Exception                Siste: @database.LastOccurred                 currentCol  = 1;          if (currentCol == 2columns were displayed,switch row    currentCol = 0;   
- `. B  U8 ], \}     firstTime = database.DB; }提前Tnx
7 W: j' M! |" b5 D5 _                                                                0 U8 K) h2 r' F/ [8 \( D
    解决方案:                                                                % p1 N2 |& {8 ?3 c0 Y( v5 o, o
                                                                解决这个问题的一种方法是在拥有数据之前L2SQL切换到L2Object,然后再分组排序:
% Z( R; J9 ?: ~var result = dataBaseList.GroupBy(x => x.Key)          .SelectMany(...)          .AsEnumerable()          .GroupBy(x => x.DB)          .OrderByDescending(g => g.Max(x => x.LastOccured));这将给你组列表和Key的DB,群体的最后一个异常顺序。
) L0 t7 t5 q. ^7 b9 M可以使用嵌套结果foreach循环:
) s2 J! |2 s0 N% wswitch row        currentCol = ( }( I  G3 Z/ U# r( }' H* [
                      switch row        currentCol = 0;        
' h( J) L$ d0 H, k      }    }  }
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则