Sql server 具有计数、分组依据且未显示的视图
我在数据库上设置了一个视图来跟踪活动、按日期分组和按用户计数。日期是一个Sql server 具有计数、分组依据且未显示的视图,sql-server,entity-framework,sql-server-2008,group-by,asp.net-mvc-5,Sql Server,Entity Framework,Sql Server 2008,Group By,Asp.net Mvc 5,我在数据库上设置了一个视图来跟踪活动、按日期分组和按用户计数。日期是一个DateTime列,因此我必须将其转换为仅使用日期部分。在数据库中,视图中的数据是正确的,但是当视图显示在MVC5中时,它会多次显示一些数据 为视图选择查询: SELECT TOP(100)PERCENT DATEADD(dd, DATEDIFF(dd, 0, DateCompleted),0) AS WorkDate, UserName, Count(UserName) AS Total FROM dbo.Queue GR
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);
}
public ActionResult活动()
{
IQueryable activity=db.activity.OrderBy(a=>a.WorkDate),然后是by(a=>a.UserName);
返回视图(活动);
}
他认为:
@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>
@model IEnumerable
@DisplayNameFor(model=>model.WorkDate)
@DisplayNameFor(model=>model.UserName)
@DisplayNameFor(model=>model.Total)
@foreach(模型中的var项目){
@DisplayFor(modelItem=>item.WorkDate)
@DisplayFor(modelItem=>item.UserName)
@DisplayFor(modelItem=>item.Total)
}
奇怪的是,数据库的结果集中有22行,视图也显示了22行,但是它显示了两到三次相同的行,而没有显示其中的一些行。如果您能帮我弄清真相,我们将不胜感激。我知道这并不能解决您的问题,但您认为您有一些问题。顶尖的100%不会做你认为会做的事。我假设您添加了这一点,因为您希望视图“有序”,并且当视图声明中有ORDERBY但没有top时,您会收到一条错误消息。这里的问题是,在视图中添加orderby并不能保证视图的输出将按该顺序返回。事实上,这在逻辑上甚至没有意义。如果在一个查询中有两个视图,并且它们都有一个相互矛盾的ORDERBY子句,该怎么办?哪一个赢了?确保查询结果顺序的唯一方法是在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
您是否100%确定显示的22行中的数据是重复的?您可以将datetime列强制转换或转换为日期。将是更简单的代码。我不太明白问题出在哪里或什么地方。问题出在sql视图还是mvc视图中?@SeanLange:试图强制转换为日期,但出现了一个错误,即无法处理日期方法。SQL视图中的数据很好,所以我认为问题一定出在MVC端。@DavidG:是的,正如您所期望的,SQL视图每个用户每个日期有一行。MVC视图以看似随机的顺序在同一日期多次显示同一用户。数据是按日期排序的,因此日期应该连续运行,但它们会前后缩减。我没有添加顶部(100%)的百分比,系统在添加select列时自己做了。您的select语句给了我一个SQL执行错误:无法在日期调用方法。啊,您必须使用GUI“创建新视图”。我从来没有使用过这个工具,因为手工创建查询比使用可视化工具更快。我很好奇你得到了什么信息。您声明的消息看起来不像sql server错误消息。事实证明,这是SSMS中视图设计器的一个错误。难怪我想不出来。如果你用sql而不是设计器来编写视图,这个问题就会消失。谢谢你的帮助,肖恩。因此,现在已将我的问题标记为重复,并指向EF使用的视图的键不是唯一的答案。我强迫它使用复合键,这似乎解决了我的问题。