+-

考虑以下个人实体:
public class Person
{
public int Id { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
}
使用以下表达式(使用PredicateBuilder构造)作为标准:
var byName = PredicateBuilder.True<Person>().And(x => x.FirstName == "Chaim");
使用以下语法调用时,生成的SQL很好(包括WHERE语句):
ctx.Set<Person>().AsExpandable().Where(x => byName.Invoke(x));
但是,当使用这种稍有不同的语法调用时,不涉及SQL WHERE,并且过滤由Enumerable完成.
ctx.Set<Person>().AsExpandable().Where(byName.Invoke);
有什么想法吗?
最佳答案
从方法组到(相应委托类型的)表达式没有隐式转换.从方法组到匹配签名的委托存在隐式转换.因此,只有IEnumerable重载匹配.
当然,这并不是说您需要使用lambda.写吧:
ctx.Set<Person>().AsExpandable().Where(ByName);
由于您要传递一个表达式(毕竟,ByName是一个Expression< Person,bool> ;,这正是Queryable.Where< Person>所要求的),因此它将作为查询而不是对对象的查询进行评估.
点击查看更多相关文章
转载注明原文:c#-使用AsExpandable()将Linq更改为实体行为 - 乐贴网