我有一个显示更新的应用程序错误列表的仪表板。有些错误不止一次发生过,所以我按错误类型对它们进行了分组,并对它们进行了计数,看看这个错误发生了多少次。我想知道错误发生的第一个日期,这是相当直接的,但也是它发生的最后日期,看看这个错误持续了多长时间。
下面我展示了我当前的输出和预期输出
下面我展示了我的代码。为了显示最后日期和第一个日期,我需要做出哪些更改?我尝试过使用LastOrDefault()
但实际上并没有像将LINQ查询转换为SQL语句那样工作,没有BOTTOM 1
命令。
public ActionResult Errors(string sortOrder, int? page)
{
ViewBag.CurrentSort = sortOrder;
ViewBag.DateSortParm = sortOrder == "Date" ? "date_desc" : "Date";
var queryString = RouteData.Values["id"];
var applications = db.ElmahErrors.Where(s => s.Application.Replace("/", "").Replace(".", "") == queryString)
.GroupBy(s => s.Type)
.Select(grp => new ErrorCountModel
{
ErrorCount = grp.Count(),
ElmahError = grp.FirstOrDefault()
});
switch (sortOrder)
{
default:
applications = applications.OrderBy(s => s.ElmahError.TimeUtc);
break;
}
int pageSize = Int32.Parse(System.Configuration.ConfigurationManager.AppSettings["DefaultPageSize"]);
int pageNumber = (page ?? 1);
return View(applications.ToPagedList(pageNumber, pageSize));
}
public class ErrorCountModel
{
public int ErrorCount { get; set; }
public ElmahError ElmahError { get; set; }
}
非常感谢任何有关此事的帮助。
提前致谢。
答案 0 :(得分:0)
附注:以下内容无法保证能为您提供最新的错误,因为您还没有告诉它排序
ElmahError = grp.FirstOrDefault()
应该是这样的:
ElmahError = grp.OrderBy(s => s.ElmahError.TimeUtc).FirstOrDefault();
我原本期望.LastOrDefault()可以工作,但如果它真的没有,你可以这样做:
LastElmahError = grp.OrderByDescending(s => s.ElmahError.TimeUtc).FirstOrDefault();
基本上,你颠倒了第一个错误的顺序。
另外,将其添加到ErrorCountModel
模型类:
public ElmahError LastElmahError { get; set; }
答案 1 :(得分:0)
另一种方法是创建一个视图模型,如下所示:
public class ElmahErrorViewModel {
public Guid ID {get;set;}
public string Application {get;set;}
public string Host {get;set;}
public string Type {get;set;}
public int ErrorCount {get;set;}
public DateTime Min {get;set;}
public DateTime Max {get;set;}
}
然后只是:
var applications = db.ElmahErrors.Where(s => s.Application.Replace("/", "").Replace(".", "") == queryString)
.GroupBy(s => new { s.Type, s.ID, s.Application, s.Host })
.Select(grp => new ElmahErrorViewModel {
ID = grp.Key.ID,
Application = grp.Key.Application,
Host = grp.Key.Host,
Type = grp.Key.Type,
ErrorCount = grp.Count(),
Min = grp.Min(m => m.TimeUtc),
Max = grp.Max(m => m.TimeUtc),
});
这个想法是,这会返回一个准备好的扁平模型,而我假设有一个LastElmahError
属性,你仍然必须在某个时候将它展平,以便在UI中显示它,并且你实际想要的唯一字段是那是TimeUtc
所以大部分都是多余的。