3

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

但是,当使用这种略有不同的语法调用时,不WHERE涉及SQL,Enumerable.Where而是通过以下方式完成过滤:

ctx.Set<Person>().AsExpandable().Where(byName.Invoke);

有什么想法吗?

4

1 回答 1

4

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

当然,这并不是说您需要使用 lambda。写吧:

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

由于您正在传递一个表达式(ByName毕竟,Expression<Person, bool>已经是一个,这正是Queryable.Where<Person>需要的),这将作为一个查询进行评估,而不是在 linq 中对对象进行评估。

于 2013-11-27T20:05:06.570 回答