日期上的Asp.net LINQ groupby和orderBy不能检索期望的输出
本文关键字:不能 orderBy 检索 期望 输出 groupby Asp net LINQ 日期 | 更新日期: 2023-09-27 18:04:00
我正在使用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);
应该得到以下输出:
Database1:
例外1(22次)最后发生:22.10.1989 19:30
例外2(2次)最近发生20.5.1980 14.50
Database2
例外1(22次)最后发生:21.10.1989 19:30
例外2(2次)最近发生20.5.1980 14.50
然后突然列表在数据库中更新了一个新条目2,所以我必须把这个数据库放在顶部:
Database2
例外1(1次)最近发生:29.07.2011 12.00
例外1(22次)最后发生:21.10.1989 19:30
例外2(2次)最近发生20.5.1980 14.50
Database1:
例外1(22次)最后发生:22.10.1989 19:30
例外2(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>
处理这个问题的一种方法是在您拥有数据之后从L2SQL切换到L2Objects,然后再次分组,以便您可以排序:
var result = dataBaseList.GroupBy(x => x.Key)
.SelectMany(...)
.AsEnumerable()
.GroupBy(x => x.DB)
.OrderByDescending(g => g.Max(x => x.LastOccured));
这将为您提供具有Key
或DB
的组的列表,按照组的最后一个例外的顺序。
<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>