回答

收藏

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

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

我正在使用linq2sql处理asp.net mvc3应用程序。
, k% ], t5 ?& [/ x, h/ {! G, @我有一个SiteLog对象类型列表还包括每个对象:一个名称CLRExceptionType字符串和一个名字EntryDate字典中包含此列表:6 |1 }2 \6 w" I7 t+ {" S& O
private Dictionary> dataBaseList = new Dictionary>();DataClasses1DataContext db = new DataClasses1DataContext("string1");DataClasses1DataContext db2 = new DataClasses1DataContext("string2");然后在函数中的同一控制器中填写词汇表:
: E5 [0 |& Z- f) }: ]; N            private void CreateDictionary()()()()()()()(                 )()()()()()()()()()()()()()()()())())()())()())())()()()()())()())()()())())()()())()()()()()())()())())()())()())())())())()())()()()())())()())())()()))()()())())())())()()()))())()())()())()()())())())())())())())())()())())())()))()))()))()))())())()))())))())))))()))))()))()))())))())()))())))()))))())))()))))())))))()))))()))())))())))()))()))))()))()))()))))))()))))))())))()))))()))))()))))()))())))))()))))()))())))))()))))))))()()()))())))))))))())))))))))())))))))))())())()())()))())))))()))))()))))))))())))))))))())))))))))())))))())()))))dataBaseList.Add("db",db.SiteLogs.ToList();     dataBaseList.Add("db2",db2.SiteLogs.ToList());}然后我有这个Linq查询:
8 `! f& N8 X' l( h; |5 ]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);那应该给我以下输出
$ Q* r5 p" ]* b# x+ A+ k0 @5 J/ lDatabase1:
! f1 g5 m! [! N' O" k3 D0 LException1(22次)上次发生:22.22.1989 19:30/ e: ^. [  b" M& M; i
Exception2(2)20.5.1980 14.50  
: g, L! U6 o& W* `; L9 [Database2
  z7 g' Z9 }4 O! EException1(22次)上次发生:21.10.1989 19:30
* [  s- y7 c. d% g, l. C+ q# C* RException2(2)20.5 .1980 14.50  % c! D0 w. t5 i, X
然后突然用数据库2中的新项目更新列表,所以我必须把这个数据库放在前面:
& O( [! G% J1 g9 u( \数据库2
0 l( y+ e( J3 s8 {% N7 AException1(1次)最后
/ M$ J3 s( L; s, q4 f! L6 z" D. `: J一次出现:29.07.2011 12.00 Exception1(22次)最后一次出现:21.10.1989 19:30
- m. \. d5 Y* C6 ^- M" p" MException最后一次发生在20次(2次).5.1980 14.50  + q9 k' R7 k0 |( C4 K5 j- W- h2 ~, M
Database1:7 S: q) W( O0 O0 g7 ~
Exception最后一次发生在:22.10.1989 19:30+ L, D6 e6 q2 _" K6 z* |
Exception最后一次发生在20次(2次).5.1980 14.50  + e7 W# a, D. f
因此,基本上,我可以根据日期对数据库中的日志进行排序,但我不能根据数据库上的最后日期对数据库进行排序。如何解决这个问题?查看代码(Index.cshtml):, g+ ~% T9 a: b. N; @' F, F9 o5 [
@{    string firstTime = "";} @foreach( var database in Model)          int currentCol = if (!(firstTime == database.DB))                    
$ W7 y3 [# I- S- C4 E @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;    $ q/ s0 O9 W2 O+ C6 A# d# T9 E
}     firstTime = database.DB; }提前Tnx6 w$ G# I9 R; M, L" ~( E4 o
                                                                # D' h- L& t7 f# H' |
    解决方案:                                                                ; @  q* k+ D( O; U4 I# b/ y" O
                                                                解决这个问题的一种方法是在拥有数据之前L2SQL切换到L2Object,然后再分组排序:
8 b1 ~: p5 p' R. `. }$ Zvar result = dataBaseList.GroupBy(x => x.Key)          .SelectMany(...)          .AsEnumerable()          .GroupBy(x => x.DB)          .OrderByDescending(g => g.Max(x => x.LastOccured));这将给你组列表和Key的DB,群体的最后一个异常顺序。
8 K3 F3 y* }( i) @# {可以使用嵌套结果foreach循环:
, r+ p6 n# P4 B4 E4 N6 Y4 sswitch row        currentCol =
' ^+ x. E7 a1 w5 F2 Y, e* u& @                      switch row        currentCol = 0;        % z" P% @% y0 X5 W  ?
      }    }  }
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则