考虑以下Person
实体:
public class Person
{
public int Id { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
}
使用以下Expression
(使用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.Where
进行过滤:
ctx.Set<Person>().AsExpandable().Where(byName.Invoke);
有什么想法吗?
答案 0 :(得分:4)
没有从方法组到Expression
(相应委托类型)的隐式转换。 是从方法组到匹配签名的委托的隐式转换。因此,只有IEnumerable
重载匹配。
当然,这并不是说你需要使用lambda。只需写下:
ctx.Set<Person>().AsExpandable().Where(ByName);
由于您传入了一个表达式(ByName
毕竟已经是Expression<Person, bool>
,这正是Queryable.Where<Person>
所要求的),这将作为查询进行评估,而不是linq to objects。