Distinct子句导致类型错误

时间:2015-04-16 10:13:44

标签: c# asp.net asp.net-mvc entity-framework

尝试在ASP.net MVC实体框架中执行.Distinct()子句,但在以下代码中出错:

var tblGlobalLogOnLogOffStudentBans = db.tblGlobalLogOnLogOffStudentBans.Include(t => t.tblGlobalLogOnLogOffTime).OrderBy(t => t.StartBan).Take(10).Select(t => t.UserID).Distinct();

错误是:

  

异常详细信息:System.InvalidOperationException:模型项   传入字典的类型   ' System.Collections.Generic.List`1 [System.Nullable`1 [System.Int32]]&#39 ;,   但是这个字典需要一个类型的模型项   ' System.Collections.Generic.IEnumerable`1 [Dashboard.tblGlobalLogOnLogOffStudentBan]'

t => t.UserID是一个Int,但在页面上显示为用户名+第一个&姓。有什么想法吗?

由于 克里斯

2 个答案:

答案 0 :(得分:6)

您正在选择用户ID(产生一系列用户ID),然后在其上调用Distinct。结果仍然是一系列用户ID ...而看起来您的页面需要一系列tblGlobalLogOnLogOffStudentBan。我怀疑你想保留整个实体,但只是通过用户ID使它们不同。分组最容易做到:

 var tblGlobalLogOnLogOffStudentBans = db.tblGlobalLogOnLogOffStudentBans
    .Include(t => t.tblGlobalLogOnLogOffTime)
    .OrderBy(t => t.StartBan)
    .GroupBy(t => t.UserID)
    .Select(g => g.First())
    .Take(10);

请注意,我已将分组移至 Take(10)之前,假设您需要前10个用户而不是前10个禁止然后按用户分组。 (您确定不希望OrderByDescending显示最近最近的禁令吗?)

答案 1 :(得分:0)

问题可能是您的视图正在等待List<Dashboard.tblGlobalLogOnLogOffStudentBan>类型的模型,但您发送的是由{1}}选择创建的IEnumerable Int32类型的Select()类型。

假设情况如此,解决方案是将视图@model更改为List Int32