我有一个显示错误列表的应用程序。以前它显示了数据库中的每个错误,但我现在已经在其上放置了一个GroupBy来将所有重复出错的错误组合在一起。
它现在只显示每个组的FirstOrDefault()
,但我希望有一个列,说明每个错误发生了多少次。
从上图中可以看出,这是我目前的输出。例如,如果你取得最高记录,/ 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代码中?那么我将如何继续在我看来显示该值呢?
对此的任何帮助将不胜感激。
提前致谢
答案 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()
});
您还必须相应地更新您的视图。