c# - 简单的 Where 子句在 EF5 中停止工作

标签 c# entity-framework entity-framework-5 where-clause

我有几个查询,类似于下面的两个示例:

// Example 1:
var dataSeries = (from d in DataSeries
                  where d.Symbol == symbol
                  select d).FirstOrDefault();

// Example 2:
return Markets.Where(m => m.DataSeries == dataSeries).ToArray();

在我运行“从数据库更新模型...”之前,它工作得很好。现在,我收到了 NotSupportedException:

Unable to create a constant value of type 'MyTest.Symbol'. Only primitive types or enumeration types are supported in this context.

是的,我验证了symbol和d.Symbol(以及m.DataSeriesdataSeries)是相同类型。

是的,我可以更改查询以使用 P/F 键关系,如下所示:

var dataSeries = (from d in DataSeries
                  where d.Symbol.Id == symbol.Id
                  select d).FirstOrDefault();

但当对象关系工作正常时,我真的不想将所有代码更改为 P/F 键关系。

问题:如何让我的第一个示例再次运行?

最佳答案

您无法在针对数据库执行的 LINQ 查询中编写类似的 where 子句。请记住,代码将被转换为 SQL 并将在数据库引擎上运行。

那么,对于第一个示例, Entity Framework 如何知道如何比较复杂类型 MyTest.Symbol 的两个实例? EF 根本做不到,因为没有合适的 SQL 来进行这样的比较。

您必须在 where 子句中指定数据库引擎能够理解的内容,这基本上是基于原始类型中的 ID 的 SQL WHERE 子句(intbigint,...)。

可以使用.ToList()从数据库中获取所有数据,并将where子句应用于内存中的结果列表,因此 where 子句不必转换为 SQL:

Markets.ToList().Where(m => m.DataSeries == dataSeries);

但是您将失去数据库服务器的所有好处:内存使用量大(所有内容都在上下文中加载),性能不佳......等等。

您确实应该针对数据库执行 where,这意味着您必须使用原始类型进行比较:

Markets.Where(m => m.DataSeries.ID == dataSeries.ID);

关于c# - 简单的 Where 子句在 EF5 中停止工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14731793/

相关文章:

c# - MVC 获取错误 - 创建数据库权限被拒绝

c# - 如何避免 EF 生成的查询中的 N+1

c# - C#-如何按日期对数据表进行排序

c# - 如何在 C# .NET 中捕获打印作业

c# - Entity Framework 有mysql,实体没有PK

c# - 存储库模式和导航属性

c# - using语句的用法

c# - 之间的差异

c# - 在 Ninject 中部署

entity-framework - 面向 .NET 4.5 后,EF 数据注释不是 "working"