C# 其中实体框架中带有实体SQL参数的查询生成器方法出错
我试图遵循Julia Lerman的书《编程实体框架第二版》中的一个示例,但以下代码对我不起作用: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’”) 我得到以下错误
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扩展方法的位置。