显示GroupBy ASP.NET MVC的第一个实例和最后一个实例

时间:2015-08-21 07:41:02

标签: c# asp.net asp.net-mvc linq

我有一个显示更新的应用程序错误列表的仪表板。有些错误不止一次发生过,所以我按错误类型对它们进行了分组,并对它们进行了计数,看看这个错误发生了多少次。我想知道错误发生的第一个日期,这是相当直接的,但也是它发生的最后日期,看看这个错误持续了多长时间。

下面我展示了我当前的输出和预期输出

当前输出

enter image description here

预期产出

enter image description here

下面我展示了我的代码。为了显示最后日期和第一个日期,我需要做出哪些更改?我尝试过使用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));
}

ErrorCount模型

public class ErrorCountModel
{
        public int ErrorCount { get; set; }
        public ElmahError ElmahError { get; set; }
}

非常感谢任何有关此事的帮助。

提前致谢。

2 个答案:

答案 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所以大部分都是多余的。