【问题标题】:Calling Query builder methods on IQueryable<T>在 IQueryable<T> 上调用查询生成器方法
【发布时间】:2015-09-22 21:38:33
【问题描述】:

我正在阅读 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 上使用查询生成器方法。如果您想附加查询 builder 方法到这个 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 版

我的代码有什么问题?

【问题讨论】:

  • 如果你说:((ObjectQuery)context.Contacts.Where("it.FirstName='Robert'").Take(10)会发生什么?
  • 当我调用 ((ObjectQuery) context.Contacts.Where("it.FirstName='Robert'")).Take(10) 时,它工作正常。

标签: entity-framework-4.3


【解决方案1】:

嗯,没有人是完美的。这是书中的一个漏洞。异常消息毫无疑问。

构建 EntitySQL 查询与构建 LINQ 查询是完全不同的操作。前者基本上包括构建一个字符串并通过查询构建器方法附加它。这需要了解 LINQ 查询所没有的元素,例如别名。

另一方面,构建 LINQ 查询就是构建表达式树。可以从 EntitySQL 查询构建表达式,因为在这种情况下,ES 查询只是将自身返回为 ConstantExpression

因此,如果您从 LINQ 开始,则一直是 LINQ。

【讨论】:

    【解决方案2】:

    您可以在使用 QueryBuilder 方法构建的构造上使用 LINQ 运算符,例如您的示例:

    context.Contacts.Where("it.FirstName='Robert'").Take(10)
    

    但不是相反。

    context.Contacts.Take(10).Where("it.FirstName='Robert'")
    

    ****编辑****

    好的,我将删除 MSDN 讨论并返回到您的教科书文本。 在您的 Julia Lerman 书的第 221 页,在“如何区分 LINQ 方法和 QueryBuilder”中,它解释了 LINQ 使用 lamda 表达式和 eSQL 字符串表达式。所以在你的 .Where("it.FirstName='Robert'") 这不是一个 lambda 表达式,所以它变成了一个实体 SQL 字符串。您的 Take(10) 是一个 lambda,因此它不会返回您期望的类型。

    【讨论】:

    • 但是为什么第二个查询不起作用。如果将 IQueryable 强制转换为 ObjectQuery,我应该能够调用 QueryBuilder 方法。
    • 如您所说,我们不能在 IEnumerable 上调用查询生成器方法。当您说 LINQ 运算符时,我认为您是在谈论所有返回 IEnumerable 的 LINQ 运算符(LINQ to Objects)。但是当我使用 LINQ to Entities 时,有些方法会返回 IQueryable。例如:public static IQueryable Where(this IQueryable source, Expression> predicate);
    猜你喜欢
    • 2021-12-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-04
    • 2014-10-15
    • 1970-01-01
    • 2016-05-13
    • 1970-01-01
    相关资源
    最近更新 更多