+-
c#-使用AsExpandable()将Linq更改为实体行为
考虑以下个人实体:

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&gt ;,这正是Queryable.Where< Person>所要求的),因此它将作为查询而不是对对象的查询进行评估.

点击查看更多相关文章

转载注明原文:c#-使用AsExpandable()将Linq更改为实体行为 - 乐贴网