Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/305.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 其中实体框架中带有实体SQL参数的查询生成器方法出错_C#_Entity Framework_Entity Framework 6 - Fatal编程技术网

C# 其中实体框架中带有实体SQL参数的查询生成器方法出错

C# 其中实体框架中带有实体SQL参数的查询生成器方法出错,c#,entity-framework,entity-framework-6,C#,Entity Framework,Entity Framework 6,我试图遵循Julia Lerman的书《编程实体框架第二版》中的一个示例,但以下代码对我不起作用: ObjectQuery<Contact> contacts = context.Contacts .Where("it.FirstName = 'Robert'") ObjectQuery contacts=context.contacts .Where(“it.FirstName=‘Robert’”) 我得到以下错误

我试图遵循Julia Lerman的书《编程实体框架第二版》中的一个示例,但以下代码对我不起作用:

ObjectQuery<Contact> contacts = context.Contacts
                                .Where("it.FirstName = 'Robert'")
ObjectQuery contacts=context.contacts
.Where(“it.FirstName=‘Robert’”)
我得到以下错误:

参数2:无法从“字符串”转换为“System.Linq.Expresions.Expression>”

如何访问ObjectQuery的查询生成器方法?我使用的是实体框架6,书中的示例使用的是实体框架4。我的上下文类继承自
DbContext
,在本书的示例中,上下文类继承自
ObjectContext


Entity Framework 6中是否仍使用查询生成器方法?

如果要使用字符串,则需要使用参数化,其中需要第二个带值的参数

我认为使用带有lambda表达式的直LINQ更干净

尝试:

ObjectQuery联系人=
context.Contacts.Where(“it.FirstName=@FirstName”,
新的ObjectParameter(“firstname”,firstname));

标准Linq查询不为类型为
字符串的
Where
提供重载

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

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

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

var objectContext = (context as IObjectContextAdapter).ObjectContext;
        var query = objectContext.CreateObjectSet<Customer>().Where("it.FirstName='Robert'").OrderBy("it.LastName");
现在,您可以像这样使用查询生成器方法:

var objectContext = (context as IObjectContextAdapter).ObjectContext;
        var query = objectContext.CreateObjectSet<Customer>().Where("it.FirstName='Robert'").OrderBy("it.LastName");
var query=objectContext.CreateObjectSet().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);
    }
}
private static void OrderByAndWhereUsingEntitySQL\u和querybuildermethods()
{
使用(var context=new AWEntities())
{//使用实体SQL和辅助查询生成器方法
//dbContext没有接受esql字符串语句的Where方法
//获取dbContext的ObjectContext类
var objectContext=(上下文为IObjectContextAdapter);
//现在我们可以使用Where方法来理解esql字符串语句
var query=objectContext.CreateObjectSet().Where(“it.FirstName='Robert')).OrderBy(“it.LastName”);
//执行查询
var customers=query.ToList();
foreach(客户中的var客户)
Debug.WriteLine(cust.LastName.Trim()+“,”+cust.FirstName);
}
}

var contacts=context.contacts.Where(it=>it.FirstName==“Robert”)在这种情况下是lambda(linq表达式也可以)。您应该仔细阅读lambda语法,这里有一个有用的链接:好的,但我的代码有什么问题,与书中相同,我不想使用IEnumerable.Where扩展方法。在我的示例中,哪里是查询生成器方法。
context
的类型是什么,以及
Contacts
属性的类型是什么?我分别假设了
DbContext
DbSet
。是的,没错。我是关于理解查询生成器方法的,Julia Lerman的第二版,第235页。有关如何使用查询生成器的示例,请参见此链接。问题是,与使用提供类型安全性的表达式相比,这种方法过时了。发布日期是什么?是的,但我正在尝试使用ObjectQuery类的查询生成器方法“Where”,您应该能够向其传递表示实体Sql的字符串。请参见更新的查询,我将使用lambda表达式。我只想将名称硬编码为“it.FirstName='Robert'”。如果我运行你的例子,我会得到一个错误:没有重载需要2个参数,因为它仍然引用linq扩展方法的位置。