【问题标题】:How to count a list of non primitive objects in Entity Framework?如何计算实体框架中的非原始对象列表?
【发布时间】:2011-10-25 01:18:52
【问题描述】:

我需要计算一个对象有多少个,然后存储这个数字。

我尝试了以下方法:

var order = db.Questions.Where(x => x.Owner == owner).Count();

失败并显示以下消息:

无法创建“MVCApp.Models.Owner”类型的常量值。此上下文仅支持原始类型(“例如 Int32、String 和 Guid”)。

我已将代码修改为:

var order = db.Questions.Where(x => x.Owner == owner);
int bla = 0;
foreach (var item in order)
{
    bla++;
}

我所做的工作似乎没有任何缺点(除了需要额外的几行代码),但是,我真的很想了解这个问题及其背后的问题。

Where 命令使对象正常,那么,为什么Count 不起作用?

谁能给点建议?

【问题讨论】:

  • 如果您觉得不对,请更正标签并提出问题...我不确定这是实体框架问题还是与 Linq 查询直接相关:/

标签: c# linq entity-framework-4.1


【解决方案1】:

我怀疑owner 是一个类的实例,也许是另一个实体?在这种情况下,您可能想要做的是检查外键是否与所有者 ID 相同(或相反,具体取决于您如何建立关系)。如果这是真的,那么它之前不起作用的原因是它不知道如何将对象相等性转换为 SQL 表达式。它需要使用定义了表达式翻译的原始类型。

var count = db.Questions.Where( x => x.OwnerID == owner.ID ).Count();

【讨论】:

  • 我现在感觉有点白痴 - 看来我的 foreach 循环实际上并没有按预期工作。我将其更改为x.owner.id == owner.id - 现在它似乎与count() 一起工作正常。 ...我不得不问,这是一个错误吗?单一选择似乎适用于复杂类型,并且考虑到这应该只是一个常规比较谓词,我真的不明白为什么它更复杂......无论如何,非常感谢您的回答。 +1/回答
【解决方案2】:

而不是循环,我相信你应该能够做到这一点:

var bla = db.Questions.Where(x => x.Owner == owner).AsEnumerable().Count();

我不知道为什么您无法使用 EF 获得 Count() 的项目,但在这里恢复使用 LINQ to Objects 应该可以正常工作。

【讨论】:

  • 您需要为这种方法实现所有Questions - 这将非常低效
  • 是的,很不幸,但至少它比循环更有效。虽然看起来 tvanfosson 的解决方案会是更好的选择。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-04-25
  • 2011-12-29
  • 2020-06-29
  • 2011-09-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多