我正在阅读Julia Lerman的programming_entity_framework_2nd_edition。
本书说我们可以在ObjectQuery上使用LINQ to Entities方法。喜欢这个
context.Contacts.Where("it.FirstName='Robert'").Take(10)
以下是本书的摘录,其中说我们可以将IQueryable转换为ObjectQuery
“但是,您不能采用其他方式,将查询构建器方法添加到LINQ方法中。 例如,context.Contacts.Take(10)返回一个System.LINQ.IQueryable。您可以 仅在ObjectQuery上使用查询构建器方法。如果要附加查询 对于这个IQueryable的构建器方法,首先必须将LINQ查询转换为 ObjectQuery然后追加该方法。将LINQ to Entities查询转换为 ObjectQuery是可能的,因为ObjectQuery实现了IQueryable“
但是当我尝试执行此查询时,我得到一个异常,说明“LINQ to Entities查询不支持查询构建器方法。有关更多信息,请参阅实体框架文档。”
((ObjectQuery<Contact>)context.Contacts.Take(10)).Where("it.FirstName='Robert'")
我正在使用EntityFramework版本4.3.0
我的代码出了什么问题?
答案 0 :(得分:1)
您可以在使用QueryBuilder方法构建的构造上使用LINQ运算符,如示例所示:
context.Contacts.Where("it.FirstName='Robert'").Take(10)
但不是其他方式。
context.Contacts.Take(10).Where("it.FirstName='Robert'")
**** **** EDIT
好的我正在删除MSDN讨论并返回到教科书的文本。 在Julia Lerman一书的第221页上,在“如何区分LINQ方法和QueryBuilder之间”中,它解释了LINQ使用lamda表达式和eSQL字符串表达式。所以在你的.Where(“it.FirstName ='Robert'”)中,这不是lambda表达式,因此它变成了一个Entity SQL String。你的Take(10)是一个lambda,所以它不会返回你期望的类型。
答案 1 :(得分:1)
嗯,没有人是完美的。这是书中的一个缺陷。异常消息毫无疑问。
构建EntitySQL查询与构建LINQ查询完全不同。前者基本上包括构建一个字符串并通过查询构建器方法附加它。这需要了解LINQ查询没有的元素,例如别名。
另一方面,构建LINQ查询正在构建表达式树。可以从EntitySQL查询构建表达式,因为在这种情况下,ES查询只是将自己返回为ConstantExpression
。
因此,如果你从LINQ开始,它一直是LINQ。