查找GroupBy ASP.NET MVC中的实例数

时间:2015-08-20 12:53:04

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

我有一个显示错误列表的应用程序。以前它显示了数据库中的每个错误,但我现在已经在其上放置了一个GroupBy来将所有重复出错的错误组合在一起。

它现在只显示每个组的FirstOrDefault(),但我希望有一个列,说明每个错误发生了多少次。

enter image description here

从上图中可以看出,这是我目前的输出。例如,如果你取得最高记录,/ LM / W3SVC / 7 / ROOT有13个相同错误的实例。我想要做的是添加另一个列,显示每个错误发生了多少次,在这种情况下,将是13。

控制器

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 => grp.FirstOrDefault());

       switch (sortOrder)
       {
           default:
               applications = applications.OrderByDescending(s => s.TimeUtc);
               break;
       }
        int pageSize = Int32.Parse(System.Configuration.ConfigurationManager.AppSettings["DefaultPageSize"]);            
        int pageNumber = (page ?? 1);

       return View(applications.ToPagedList(pageNumber, pageSize));
}

视图

@model PagedList.IPagedList<DataIntelligence.Models.ElmahError>
@using PagedList.Mvc;
<link href="Content/PagedList.css" rel="stylesheet" type="text/css" />

@{
    ViewBag.Title = "Application Error Dashboard";
}
<script>
    function goBack() {
        window.history.back();
    }
</script>
<div class="jumbotron">
    <h2>Application Error Dashboard</h2>
</div>

<table>
    <tr>
        <th>
            Id
        </th>
        <th>
            Application
        </th>
        <th>
            Host
        </th>
        <th>
            Type
        </th>
        <th>
            Date
        </th>
    </tr>

    @foreach (var item in Model)
    {
        <tr>
            <td>
                <a href="@Url.Action("Details", new { id=item.ErrorId})"> @Html.DisplayFor(modelItem => item.ErrorId) </a>
            </td>
            <td>
                @Html.DisplayFor(modelItem => item.Application)
            </td>
            <td>
                @Html.DisplayFor(modelItem => item.Host)
            </td>
            <td>
                @Html.DisplayFor(modelItem => item.Type)
            </td>
            <td>

                @Html.DisplayFor(modelItem => item.TimeUtc)
            </td>
        </tr>
    }
</table>
<br />
Page @(Model.PageCount < Model.PageNumber ? 0 : Model.PageNumber) of @Model.PageCount

@Html.PagedListPager(Model, page => Url.Action("Errors", new { page, sortOrder = ViewBag.CurrentSort, currentFilter = ViewBag.CurrentFilter }))

<a href="#" onclick="goBack()" style="padding-right: 0px; padding-top: 0px; padding-bottom: 0px; padding-left: 0px;">
    Back
</a>

为了实现这一目标,我需要将哪些内容添加到我的Controller代码中?那么我将如何继续在我看来显示该值呢?

对此的任何帮助将不胜感激。

提前致谢

2 个答案:

答案 0 :(得分:2)

您需要Count: -

var applications = db.ElmahErrors.Where(s => s.Application.Replace("/", "")
                                                      .Replace(".", "") == queryString)
                   .GroupBy(s => s.Type)
                   .Select(grp => new
                            {
                                 ErrorCount = grp.Count(),
                                 ErrorObj = grp.FirstOrDefault()
                            });

请注意,这里我投射的是匿名类型,但由于您需要将其绑定到View,因此您需要定义一个Model,其属性为ErrorCount,可以作为View中的列。< / p>

所以假设你定义了一个这样的类: -

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

然后你可以投射这个模型而不是像这样的匿名类型: -

 .Select(grp => new ErrorCountModel
               {
                  ErrorCount = grp.Count(),
                  ElmahError = grp.FirstOrDefault()
               });

答案 1 :(得分:0)

您需要在模型上拥有一个属性来保存计数,例如,如果您乐意显示第一条记录和计数,则可以执行此操作。

public class EmahErrorCount
{
    public EmahError Error { get; set; }
    public int Count { get; set; }
}

然后你的查询看起来像

var applications = db.ElmahErrors.Where(s => s.Application.Replace("/", "").Replace(".", "") == queryString)
                   .GroupBy(s => s.Type)
                   .Select(grp => new EmahErrorCount()
                            {
                                 Count = grp.Count(),
                                 Error = grp.FirstOrDefault()
                            });

您还必须相应地更新您的视图。