【问题标题】:Where Query Builder Method with Entity SQL parameters Error in Entity FrameworkWhere Query Builder Method with Entity SQL parameters Error in Entity Framework
【发布时间】:2018-10-31 05:57:54
【问题描述】:

我正在尝试遵循 Julia Lerman 的《Programming Entity Framework 2nd edition》一书中的示例,但以下代码对我不起作用:

ObjectQuery<Contact> contacts = context.Contacts
                                .Where("it.FirstName = 'Robert'")

我收到以下错误:

Argument2:无法从“字符串”转换为“System.Linq.Expresions.Expression>”。

如何访问 ObjectQuery 的 Query Builder 方法?我使用的是Entity Framework 6,书中的示例使用的是Entity Framework 4。我的上下文类继承自DbContext,在本书的示例中,上下文类继承自ObjectContext

Entity Framework 6 中是否仍在使用查询构建器方法?

【问题讨论】:

  • var contacts = context.Contacts.Where(it =&gt; it.FirstName == "Robert"); 在这种情况下,它是一个 lambda(linq 表达式也可以)。您应该阅读 lambda 语法,这是一个有用的链接:Lambda Expressions - C# Programming Guide
  • 好的,但是我的代码有什么问题,和书中的一样,我不想使用 IEnumerable.Where 扩展方法。在我的示例中,查询生成器方法在哪里。
  • context 的类型以及Contacts 属性的类型是什么?我分别假设DbContextDbSet&lt;Contact&gt;
  • 是的,完全正确。我正在了解查询生成器方法,Julia Lerman 的第二版,第 235 页
  • 查看此链接ObjectQuery<T>.Where Method 以获取有关如何使用查询生成器的示例。与使用提供类型安全的表达式相比,这种方法已经过时了。发布日期是什么时候?

标签: c# entity-framework entity-framework-6


【解决方案1】:

我的上下文类继承自 DbContext,在书中的示例中上下文类继承自 ObjectContext。

首先,您必须将上下文从 DbContext 更改为 ObjectContext,如下所示:

var objectContext = (context as IObjectContextAdapter).ObjectContext;

现在您可以像这样使用查询生成器方法:

        var query = objectContext.CreateObjectSet<Customer>().Where("it.FirstName='Robert'").OrderBy("it.LastName");

这是整个例子:

private static void OrderByAndWhereUsingEntitySQL_AndQueryBuilderMethods()
{
    using (var context = new AWEntities())
    {//using Entity SQL with helper Query Builder Methods
        //dbContext does not have a Where method that accepts esql string statements
        //get to the dbContext's ObjectContext class
        var objectContext = (context as IObjectContextAdapter).ObjectContext;
        //now we can use the Where method that understands esql string statements
        var query = objectContext.CreateObjectSet<Customer>().Where("it.FirstName='Robert'").OrderBy("it.LastName");
        //execute the query
        var customers = query.ToList();
        foreach (var cust in customers)
            Debug.WriteLine(cust.LastName.Trim() + ", " + cust.FirstName);
    }
}

【讨论】:

    【解决方案2】:

    如果要使用字符串,则需要使用参数化,而 Where 需要带有值的第二个参数。

    我认为直接使用带有 lambda 表达式的 LINQ 更简洁。

    试试:

    ObjectQuery<Contact> contacts =
    context.Contacts.Where("it.FirstName = @firstname",
    new ObjectParameter("firstname", firstName));
    

    【讨论】:

    • 是的,但我正在尝试使用 ObjectQuery 类的 Query Builder Method 的“Where”,您应该能够将代表 Entity Sql 的字符串传递给该方法。
    • 查看更新的查询,不过我会使用 lambda 表达式。
    • 我只想硬编码这样的名字“it.FirstName='Robert'”。我得到错误。
    • 如果我运行您的示例,我会收到错误:没有重载需要 2 个参数,因为它仍然是指 linq 扩展方法的位置。
    【解决方案3】:

    标准 Linq 查询不提供 Where 类型为 string 的重载

    Microsoft 提供了一个 NuGet 库,用于将字符串解析为 Lambda 表达式,然后可以在称为 System.Linq.Dynamic 的 Linq 查询中使用,可以在此处找到:

    https://www.nuget.org/packages/System.Linq.Dynamic/

    【讨论】:

      猜你喜欢
      • 2020-02-21
      • 1970-01-01
      • 1970-01-01
      • 2020-01-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-02
      • 1970-01-01
      相关资源
      最近更新 更多