【问题标题】:Distinct clause causing type error导致类型错误的不同子句
【发布时间】:2015-04-16 10:13:44
【问题描述】:

尝试在 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]]', 但是这本词典需要一个类型的模型项 'System.Collections.Generic.IEnumerable`1[Dashboard.tblGlobalLogOnLogOffStudentBan]'。

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

谢谢 克里斯

【问题讨论】:

  • 我怀疑您在视图中的 @model 声明中指定了错误的模型类型,并且正在传递不同类型的东西,可能是通过 return View(myModel)... 他们必须完全正确匹配

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


【解决方案1】:

您正在选择用户 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 显示最新的最近禁令吗?)

【讨论】:

  • 这很完美,但是将 (g => g.First()) 更改为 (g => g.FirstOrDefault())。是的,它将按最近的禁令排序,但也会找到一种显示禁令的方法,以便仅显示到期日期晚于或等于今天的日期。
  • @ChrisBarsby:你为什么要使用FirstOrDefault?这表明您正在尝试考虑存在空组的情况 - 但GroupBy 永远不会产生空组。至于“只有到期日晚于或等于今天的日期” - 这只是一个Where 电话,与订购无关......
【解决方案2】:

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

假设是这种情况,解决方案是将视图 @model 更改为 ListInt32

【讨论】:

  • 只有当视图实际上可以仅基于用户 ID 完成其工作时,这才是解决方案。我怀疑它不能。
  • 当然。 OP 最了解他真正需要什么,但我也认为他会想要更多,因为他在谈论用户名 + 名字和姓氏。你的答案很震撼(一如既往):)
猜你喜欢
  • 2020-09-10
  • 1970-01-01
  • 1970-01-01
  • 2013-04-25
  • 2015-12-04
  • 2020-05-17
  • 2010-09-14
  • 2021-10-23
  • 2012-11-22
相关资源
最近更新 更多