错误,LINQ to Entities 不支持的方法

Posted

技术标签:

【中文标题】错误,LINQ to Entities 不支持的方法【英文标题】:Error, method not supported by LINQ to Entities 【发布时间】:2010-01-31 01:03:00 【问题描述】:

为什么会出现这个错误:

LINQ to Entities 不支持“Single”方法。考虑改用“First”方法。

           public ActionResult Details(int id)
Line 27:                 
             var result = (from d in _db.MovieSet
Line 29:     where d.Id == id
Line 30:     select d).Single();
            //
            //
            

代码编译安全,但只有在调用相应部分时才会中断。我是 LINQ 的新手,因此不知道哪些方法适用于 LINQtoSQL 或 LINQtoEntities。这意味着更多的错误!我们无法以这种方式记住所有方法。

我的问题是,如果适用于某些类型/场景的方法有限制,为什么它们会出现在 Intellisense 中?

编辑:任何解决方法/技术有助于了解是否支持?

【问题讨论】:

【参考方案1】:

Microsoft 在 Linq to Entities 中有一个完整的 list of supported and unsupported methods。这就是找到这些信息的地方。

您会注意到 SingleSingleOrDefault 方法实际上在分页方法一节中被列为“不支持”。

正如 Jared 所指出的,编译器在编译时不知道您正在使用哪个提供程序,因此它无法强制提供程序可能实现或可能不实现的扩展方法的编译时安全性。您将不得不依赖文档。

【讨论】:

EF 1 的正确 (+1)。但是请注意,EF 4 支持这两种方法。【参考方案2】:

在 LINQtoSQL / Entities 的情况下,查询全部分解为表达式树,然后传递给提供程序 API。提供者无法提供有关他们支持或不支持的树的编译时间信息,因为没有语法差异。他们唯一的选择是提供运行时数据。

例如,在表达式树形式中,Single 和 First 都显示为 MethodCallExpression 实例。

【讨论】:

知道如何知道或只是“实践使人变得完美”吗? @Asad,许多提供商在他们的文档中都有他们支持的调用列表,但除非它是反复试验:(【参考方案3】:

不幸的是,这是 relative immaturity of EF 和 Object Relational Impedance Mismatch 的又一个迹象。

如果你选择走这条路,Documentation 是你的朋友。

【讨论】:

以上是关于错误,LINQ to Entities 不支持的方法的主要内容,如果未能解决你的问题,请参考以下文章

“LINQ to Entities 不支持 LINQ 表达式节点类型 'Invoke'” - 难倒!

在LINQ to Entities中不支持指定的类型成员'x'。只支持初始化器实体成员和实体导航属性。

LINQ to Entities 不支持 LINQ 表达式节点类型“Invoke”

分页错误:仅 LINQ to Entities 中的排序输入支持“跳过”方法。方法 'OrderBy' 必须在方法 'Skip' 之前调用

LINQ to Entities 异常中不支持指定的类型成员“日期”

LINQ to Entities 不支持指定的类型成员“日期”。 DbFunctions.TruncateTime()