其中具有实体SQL参数的查询构建器方法在实体框架中出错

时间:2016-06-24 19:58:21

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

我试图在Julia Lerman的书“编程实体框架”第2版中遵循一个例子,以下代码对我不起作用:

    override func tableView(tableView: UITableView, commitEditingStyle editingStyle: UITableViewCellEditingStyle, forRowAtIndexPath indexPath: NSIndexPath) {
        if editingStyle == .Delete {
          allItems[indexPath.section].removeAtIndex(indexPath.row)
          tableView.deleteRowsAtIndexPaths([indexPath], withRowAnimation: .Fade)
        } else if editingStyle == .Insert {
          let newData = DataItem(title: "New Data", subtitle: "", imageName: nil)
          allItems[indexPath.section].append(newData)
          tableView.insertRowsAtIndexPaths([indexPath], withRowAnimation: .Fade)
        }
      }

      override func setEditing(editing: Bool, animated: Bool) {
        super.setEditing(editing, animated: animated)

        if editing {
          tableView.beginUpdates()

          for (index, sectionItems) in allItems.enumerate() {
            let indexPath = NSIndexPath(forRow: sectionItems.count, inSection: index)

            tableView.insertRowsAtIndexPaths([indexPath], withRowAnimation: .Fade)
          }

          //tableView.beginUpdates()
          tableView.setEditing(true, animated: true)
          tableView.endUpdates()
        } else {
          tableView.beginUpdates()
}

我收到以下错误:

  

Argument2:无法从'string'转换为'System.Linq.Expresions.Expression>'。

如何访问ObjectQuery的Query Builder方法?我正在使用Entity Framework 6,本书中的示例正在使用Entity Framework 4.我的上下文类继承自ObjectQuery<Contact> contacts = context.Contacts .Where("it.FirstName = 'Robert'") ,在本书的示例中,上下文类继承自DbContext

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

3 个答案:

答案 0 :(得分:2)

  

我的上下文类从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);
    }
}

答案 1 :(得分:0)

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

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

尝试:

char *

答案 2 :(得分:0)

标准Linq查询不会为类型为Where的{​​{1}}提供重载

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

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