使用AsExpandable()奇怪的Linq to Entities行为

时间:2013-11-27 20:02:05

标签: c# linq linq-to-entities entity-framework-6 linqkit

考虑以下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);

有什么想法吗?

1 个答案:

答案 0 :(得分:4)

没有从方法组到Expression(相应委托类型)的隐式转换。 从方法组到匹配签名的委托的隐式转换。因此,只有IEnumerable重载匹配。

当然,这并不是说你需要使用lambda。只需写下:

ctx.Set<Person>().AsExpandable().Where(ByName);

由于您传入了一个表达式(ByName毕竟已经是Expression<Person, bool>,这正是Queryable.Where<Person>所要求的),这将作为查询进行评估,而不是linq to objects。