我有一些最近从 EF 4.2 升级到 EF 5.0 的代码(实际上是 EF 4.4,因为我在 .Net 4.0 上运行)。我发现我必须更改查询的语法,我很好奇为什么。让我从问题开始。
我有一个由客户端定期填充的 EventLog 表。对于每个事件日志,都会在报告表中创建一个条目。这是定期运行的查询,用于发现报告表中还没有条目的任何事件日志。我在 EF 4.2 中使用的查询是:
from el in _repository.EventLogs
where !_repository.Reports.Any(p => p.EventLogID == el.EventlogID)
由于升级到 EF 5.0,我在运行时收到以下错误:
System.NotSupportedException:无法创建“Namespace.Report”类型的常量值。此上下文仅支持原始类型或枚举类型。
我发现用连接语法重写它解决了这个问题。以下在 EF 5.0 中有效,大致等效:
from eventLog in _repository.EventLogs
join report in _repository.Reports on eventLog.EventlogID equals report.EventLogID into alreadyReported
where !alreadyReported.Any()
有些人可能对第一个查询的混合语法/样式有不同的看法,但我真的更感兴趣的是为什么会这样。EF 4.2 编译器可以为原始查询生成 SQL 但 EF 5.0 拒绝,这似乎很奇怪。这是我缺少的设置还是只是两者之间的约束收紧?为什么会这样?