Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为什么EF 5.0在编译为sql时不支持EF 4.x LINQ语法?_C#_.net_Linq_Entity Framework_Entity Framework 5 - Fatal编程技术网

C# 为什么EF 5.0在编译为sql时不支持EF 4.x LINQ语法?

C# 为什么EF 5.0在编译为sql时不支持EF 4.x LINQ语法?,c#,.net,linq,entity-framework,entity-framework-5,C#,.net,Linq,Entity Framework,Entity Framework 5,我有一些最近从EF4.2升级到EF5.0的代码(实际上是EF4.4,因为我在.NET4.0上运行)。我发现我必须更改查询的语法,我很好奇为什么。让我从这个问题开始 我有一个由客户端定期填充的EventLog表。在报告表中为每个事件日志创建一个条目。这是一个定期运行的查询,用于发现报告表中还没有条目的任何事件日志。我在EF 4.2中使用的查询是: from el in _repository.EventLogs where !_repository.Reports.Any(p => p.Ev

我有一些最近从EF4.2升级到EF5.0的代码(实际上是EF4.4,因为我在.NET4.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”。只有基元类型或枚举类型 在此上下文中受支持

我发现用join语法重写它解决了这个问题。以下内容适用于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却拒绝,这似乎很奇怪。这是我缺少的设置,还是两者之间的约束越来越紧?为什么会发生这种情况?

出于好奇,你试过转换吗

from el in _repository.EventLogs
where !_repository.Reports.Any(p => p.EventLogID == el.EventlogID)


问题是由存储库返回的类型引起的;当
\u repository.Reports
不可
IQueryable
时,该问题会重现。在这种情况下,
报告
被视为非标量变量;顺便说一句,这在LINQ是不允许的。看

关于第二个查询为何工作的问题,基本上是以下扩展方法
IQueryable
哪个组将其与
IEnumerable
连接

公共静态IQueryable GroupJoin(
这是可测量的外部,可测量的内部,
表达式外部选择器,
表达式innerKeySelector,
表达式结果选择器)
它只接受外部和内部键选择器的表达式(而不是引用非标量变量);其中,上述约束不适用


注意:如果
\u repository.Reports
属于
IQueryable
第一个查询将起作用;因为EF将正确地构建表达式树并执行适当的SQL。

我个人认为它作为一个带有连接的查询更可读。。你能从el中测试这个吗?
,而不是从el中的_repository.EventLogs那里_repository.Reports.All(p=>p.EventLogID!=el.EventLogID)
?嘿,金,我试过了,得到了同样的结果。我甚至试过:_repository.OntarioReports.Any(p=>5==5)。据我所知,这似乎是混合语法。升级是否要求您更改有关模型的任何内容?另外,(这是一个很长的机会),您是否重载了“==”操作符?我怀疑这与这里描述的错误相同:。不管怎样,堆栈跟踪非常相似……这不应该是注释吗?这些都产生相同的行为。
from el in _repository.EventLogs
where !_repository.Reports.Where(p => p.EventLogID == el.EventlogID).Any();
from el in _repository.EventLogs
where !_repository.Reports.Where(p => p.EventLogID == el.EventlogID).Count() > 0;
public static IQueryable<TResult> GroupJoin<TOuter, TInner, TKey, TResult>(
    this IQueryable<TOuter> outer,IEnumerable<TInner> inner,
    Expression<Func<TOuter, TKey>> outerKeySelector,
    Expression<Func<TInner, TKey>> innerKeySelector,
    Expression<Func<TOuter, IEnumerable<TInner>, TResult>> resultSelector)