我在数据库上设置了一个视图来跟踪活动,按日期分组并按每个用户计数。日期是一个DateTime
列,所以我不得不将其转换为只使用日期部分。在数据库中,视图中的数据是正确的,但当视图显示在MVC5
中时,它会多次显示某些数据。
为视图选择查询:
SELECT TOP(100)PERCENT DATEADD(dd, DATEDIFF(dd, 0, DateCompleted),0) AS WorkDate, UserName, Count(UserName) AS Total
FROM dbo.Queue
GROUP BY DATEADD(dd, DATEDIFF(dd, 0, DateCompleted),0), UserName, Status
HAVING (Status = N'Completed')
ORDER BY WorkDate
在MVC控制器中:
public ActionResult Activity()
{
IQueryable<Activity> activity = db.Activity.OrderBy(a => a.WorkDate).ThenBy(a => a.UserName);
return View(activity);
}
视图中:
@model IEnumerable<Models.Activity>
<table class="table">
<tr>
<th>
@Html.DisplayNameFor(model => model.WorkDate)
</th>
<th>
@Html.DisplayNameFor(model => model.UserName)
</th>
<th>
@Html.DisplayNameFor(model => model.Total)
</th>
</tr>
@foreach (var item in Model) {
<tr>
<td>
@Html.DisplayFor(modelItem => item.WorkDate)
</td>
<td>
@Html.DisplayFor(modelItem => item.UserName)
</td>
<td>
@Html.DisplayFor(modelItem => item.Total)
</td>
</tr>
}
</table>
奇怪的是,数据库的结果集中有22行,视图也显示了22行,但它显示了两三次相同的行,而根本没有显示其中的一些行。如有任何帮助,我们将不胜感激。
我知道这不是解决问题的答案,但您的观点中存在一些问题。排名前100%的人不会做你认为会做的事。我假设您添加了这一点,因为您希望视图"有序",并且当视图声明中有order by但没有top时,您会收到一条错误消息。这里的问题是,在视图中添加order by并不能保证视图的输出将按该顺序返回。事实上,这在逻辑上甚至没有意义。如果在一个查询中有两个视图,并且它们都有一个相互矛盾的order by子句,该怎么办?哪一个获胜?确保查询结果顺序的唯一方法是在select语句上使用order by,而不是在基础视图上。
SELECT --TOP(100)PERCENT
CAST(DateCompleted as Date) AS WorkDate
, UserName
, Count(UserName) AS Total
FROM dbo.Queue
WHERE Status = 'Completed'
GROUP BY CAST(DateCompleted as Date), UserName
--ORDER BY WorkDate