在 IQueryable<T> 上调用查询生成器方法
Calling Query builder methods on IQueryable<T>
我正在阅读 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) returns a System.LINQ.IQueryable。你可以
仅在 ObjectQuery 上使用查询生成器方法。如果你想附加一个查询
此 IQueryable 的构建器方法,您首先必须将 LINQ 查询转换为
ObjectQuery,然后追加该方法。将 LINQ to Entities 查询转换为
ObjectQuery 是可能的,因为 ObjectQuery 实现了 IQueryable
但是当我尝试执行这个查询时,我得到一个异常 "Query builder methods are not supported for LINQ to Entities queries. For more information, see the Entity Framework documentation."
((ObjectQuery<Contact>)context.Contacts.Take(10)).Where("it.FirstName='Robert'")
我正在使用 EntityFramework 版本 4.3.0
我的代码有什么问题?
您可以在使用 QueryBuilder 方法构建的结构上使用 LINQ 运算符,如您的示例所示:
context.Contacts.Where("it.FirstName='Robert'").Take(10)
反之则不然。
context.Contacts.Take(10).Where("it.FirstName='Robert'")
****编辑****
好的,我将删除 MSDN 讨论并返回到您的教科书文本。
在你的 Julia Lerman 书的第 221 页,在 "How can you tell the difference between LINQ methods and QueryBuilder," 里面,它解释了 LINQ 使用 lamda 表达式和 eSQL 字符串表达式。所以在你的 .Where("it.FirstName='Robert'") 这不是一个 lambda 表达式,所以它变成了一个实体 SQL 字符串。您的 Take(10) 是一个 lambda,因此它不会返回您期望的类型。
嗯,没有人是完美的。这是书中的一个缺陷。异常消息毫无疑问。
构建 EntitySQL 查询与构建 LINQ 查询是完全不同的操作。前者基本上包括构建一个字符串并通过查询构建器方法附加它。这需要了解 LINQ 查询没有的元素,例如别名。
另一方面,构建 LINQ 查询就是构建表达式树。可以从 EntitySQL 查询构建表达式,因为在这种情况下,ES 查询只是 returns 本身作为 ConstantExpression
.
因此,如果您从 LINQ 开始,那么一路都是 LINQ。
我正在阅读 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) returns a System.LINQ.IQueryable。你可以 仅在 ObjectQuery 上使用查询生成器方法。如果你想附加一个查询 此 IQueryable 的构建器方法,您首先必须将 LINQ 查询转换为 ObjectQuery,然后追加该方法。将 LINQ to Entities 查询转换为 ObjectQuery 是可能的,因为 ObjectQuery 实现了 IQueryable
但是当我尝试执行这个查询时,我得到一个异常 "Query builder methods are not supported for LINQ to Entities queries. For more information, see the Entity Framework documentation."
((ObjectQuery<Contact>)context.Contacts.Take(10)).Where("it.FirstName='Robert'")
我正在使用 EntityFramework 版本 4.3.0
我的代码有什么问题?
您可以在使用 QueryBuilder 方法构建的结构上使用 LINQ 运算符,如您的示例所示:
context.Contacts.Where("it.FirstName='Robert'").Take(10)
反之则不然。
context.Contacts.Take(10).Where("it.FirstName='Robert'")
****编辑****
好的,我将删除 MSDN 讨论并返回到您的教科书文本。 在你的 Julia Lerman 书的第 221 页,在 "How can you tell the difference between LINQ methods and QueryBuilder," 里面,它解释了 LINQ 使用 lamda 表达式和 eSQL 字符串表达式。所以在你的 .Where("it.FirstName='Robert'") 这不是一个 lambda 表达式,所以它变成了一个实体 SQL 字符串。您的 Take(10) 是一个 lambda,因此它不会返回您期望的类型。
嗯,没有人是完美的。这是书中的一个缺陷。异常消息毫无疑问。
构建 EntitySQL 查询与构建 LINQ 查询是完全不同的操作。前者基本上包括构建一个字符串并通过查询构建器方法附加它。这需要了解 LINQ 查询没有的元素,例如别名。
另一方面,构建 LINQ 查询就是构建表达式树。可以从 EntitySQL 查询构建表达式,因为在这种情况下,ES 查询只是 returns 本身作为 ConstantExpression
.
因此,如果您从 LINQ 开始,那么一路都是 LINQ。