我正在使用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: Exception1(22次)上次发生:22.22.1989 19:30 Exception2(2次)上次发生20.5.1980 14.50
Database2 Exception1(22次)上次发生:21.10.1989 19:30 Exception2(2次)上次发生20.5 .1980 14.50
然后突然用数据库2中的新条目更新列表,所以我必须将此数据库放在最前面: 数据库2 Exception1(1次)最后 一次出现:29.07.2011 12.00 Exception1(22次)最后一次出现:21.10.1989 19:30 Exception2(2次)最后一次发生于20.5.1980 14.50
Database1: 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>
提前Tnx
解决此问题的一种方法是在拥有数据之后再从L2SQL切换到L2Object,然后再次进行分组,以便进行排序:
var result = dataBaseList.GroupBy(x => x.Key) .SelectMany(...) .AsEnumerable() .GroupBy(x => x.DB) .OrderByDescending(g => g.Max(x => x.LastOccured));
这会给你组列表与Key的DB,在群体的最后一个异常的顺序。
Key
DB
要使用这些结果,可以使用嵌套的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>