我有几个查询,类似于下面的两个示例:
// 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.DataSeries和dataSeries)是相同类型。
是的,我可以更改查询以使用 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
子句(int
,bigint
,...)。
您可以使用.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/