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 ?
} } } |
|
|
|
|
|