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使用的视图的键不是唯一的答案。我强迫它使用复合键,这似乎解决了我的问题。