尝试在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,但在页面上显示为用户名+第一个&姓。有什么想法吗?
由于 克里斯
答案 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
。