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

安德鲁·杜纳威

我有一些代码最近从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拒绝,这似乎很奇怪。这是我缺少的设置,还是两者之间的约束越来越严格?为什么会这样呢?

Leyu

问题是由您的存储库返回的类型引起的。问题_repository.Reports不在时可以重现IQueryable<T>在这种情况下,将Reports其视为非标量变量;顺便说一下,这在LINQ中是不允许的。请参阅引用不支持的非标量变量

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

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)

它只接受外部和内部键选择器的表达式(而不是引用非标量变量);其中上述约束不适用。

注意:如果_repository.ReportsIQueryable<T>第一个查询,它将起作用;因为EF将正确构建表达式树并执行适当的SQL。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

为什么Google Chrome浏览器不支持此JavaScript语法?

来自分类Dev

SQL CE 4和EF 6代码优先不支持默认值

来自分类Dev

SQL CE 4和EF 6代码优先不支持默认值

来自分类Dev

此联接的EF Linq查询的正确语法是什么

来自分类Dev

C#-LINQ to EF中此查询的语法是什么?

来自分类Dev

为什么HTML5不支持字体元素?

来自分类Dev

为什么不支持HTML 5 Geolocation API?

来自分类Dev

为什么HTML5不支持字体元素?

来自分类Dev

当Edmx执行相同的工作时,为什么要使用EF 5.X DbContext Generator?

来自分类Dev

gcc 4.x不支持x87 FPU数学?

来自分类Dev

格式化字符串时出错 - ValueError: 不支持的格式字符 ',' (0x2c)

来自分类Dev

具有'%'符号的字段名称上的Django .values():“ ValueError:索引83处不支持的格式字符'_'(0x5f)”

来自分类Dev

MFC不支持小于0x0501的WINVER

来自分类Dev

不支持文化1033(0x0409)

来自分类Dev

不支持 EF Code first 关键字:'provider'

来自分类Dev

不支持Diskfilter写入>是什么导致此错误?

来自分类Dev

使用AutoMapper时,此平台不支持IDictionaryFactory

来自分类Dev

不支持LINQ to Entities

来自分类Dev

faac软件包为什么不支持mp4?

来自分类Dev

faac软件包为什么不支持mp4?

来自分类Dev

使用 GroupBy 选择 Max(),使用 linq 方法语法,EF

来自分类Dev

索引(x <> 4或y <> 5)

来自分类Dev

当浏览器不支持HTML5拖放时,支持拖放的最佳方法是什么?

来自分类Dev

4K显示器在3840x2160上不支持通过HDMI的60HZ

来自分类Dev

LINQ to SQL .Join语法

来自分类Dev

4D和GLSL,是否支持矩阵5x5?

来自分类Dev

4D和GLSL,是否支持矩阵5x5?

来自分类Dev

跨文件跨一个Typescript模块会产生0x800a01bd-JavaScript运行时错误:对象不支持此操作

来自分类Dev

此资源不支持请求实体的媒体类型'application / x-www-form-urlencoded'

Related 相关文章

  1. 1

    为什么Google Chrome浏览器不支持此JavaScript语法?

  2. 2

    SQL CE 4和EF 6代码优先不支持默认值

  3. 3

    SQL CE 4和EF 6代码优先不支持默认值

  4. 4

    此联接的EF Linq查询的正确语法是什么

  5. 5

    C#-LINQ to EF中此查询的语法是什么?

  6. 6

    为什么HTML5不支持字体元素?

  7. 7

    为什么不支持HTML 5 Geolocation API?

  8. 8

    为什么HTML5不支持字体元素?

  9. 9

    当Edmx执行相同的工作时,为什么要使用EF 5.X DbContext Generator?

  10. 10

    gcc 4.x不支持x87 FPU数学?

  11. 11

    格式化字符串时出错 - ValueError: 不支持的格式字符 ',' (0x2c)

  12. 12

    具有'%'符号的字段名称上的Django .values():“ ValueError:索引83处不支持的格式字符'_'(0x5f)”

  13. 13

    MFC不支持小于0x0501的WINVER

  14. 14

    不支持文化1033(0x0409)

  15. 15

    不支持 EF Code first 关键字:'provider'

  16. 16

    不支持Diskfilter写入>是什么导致此错误?

  17. 17

    使用AutoMapper时,此平台不支持IDictionaryFactory

  18. 18

    不支持LINQ to Entities

  19. 19

    faac软件包为什么不支持mp4?

  20. 20

    faac软件包为什么不支持mp4?

  21. 21

    使用 GroupBy 选择 Max(),使用 linq 方法语法,EF

  22. 22

    索引(x <> 4或y <> 5)

  23. 23

    当浏览器不支持HTML5拖放时,支持拖放的最佳方法是什么?

  24. 24

    4K显示器在3840x2160上不支持通过HDMI的60HZ

  25. 25

    LINQ to SQL .Join语法

  26. 26

    4D和GLSL,是否支持矩阵5x5?

  27. 27

    4D和GLSL,是否支持矩阵5x5?

  28. 28

    跨文件跨一个Typescript模块会产生0x800a01bd-JavaScript运行时错误:对象不支持此操作

  29. 29

    此资源不支持请求实体的媒体类型'application / x-www-form-urlencoded'

热门标签

归档