LINQ - 动态Where子句"查询语法"

时间:2014-09-24 13:59:16

标签: c# linq dynamicquery

我一直在搜索如何进行动态查询,以及我发现的所有内容都使用“方法语法”。

是否可以为“查询语法”创建动态谓词?

我尝试使用像

这样的东西
  

Expression<Func<TEntity, bool>>

在谓词中但编译器返回以下消息

"Cannot convert Expression<Func<TEntity, bool>> to bool"

它适用于'方法语法',但查询语法上的

有效:

Expression<Func<Localization, bool>> locClause = (l => l.id == locId);

var results = UnitOfWork.Localization.AsQueryable().Where(locClause).ToList();

不起作用:

Expression<Func<Localization, bool>> locClause = (l => l.id == locId);

var result = from l in UnitOfWork.Localization.AsQueryable()
                          where locClause 
                          select l;

有办法做到这一点吗?

2 个答案:

答案 0 :(得分:1)

不知道你需要什么Expression,我不能确定这会做你需要的一切。使用AsQueryable让我怀疑你没有(如果你直接查询提供者,你应该已经IQueryable<Localization>);但是,你必须确认。但是,如果你不需要来使用Expression,你可以这样做:

Func<Localization, bool> locClause = (l => l.id == locId);

var result = from l in UnitOfWork.Localization.AsQueryable()
                          where locClause(l)
                          select l;

或使用Predicate<T>

Predicate<Localization> locClause = l => l.id == locId;

var result = from l in UnitOfWork.Localization.AsQueryable()
                          where locClause(l)
                          select l;

当然,这意味着委托在客户端上执行,而不是转换为服务器上运行的东西(即提供者生成的T-SQL的一部分,如果现在确实发生的话)。如果您需要,则需要继续使用Expression并继续使用方法链语法:

var result = UnitOfWork.Localization.AsQueryable().Where(locClause);

我认为没有任何理由选择Predicate<T>超过Func<T,bool>,而Predicate<T>除了{{1}}更明确w.r.t.意图。

使用查询语法而不是方法链语法也没有功能上的好处 - 只是可读性/可维护性。我经常发现,对于任何与提供者复杂的方式做很多事情通常会导致下降到方法链语法。我通常只使用LINQ To Objects的查询语法。

答案 1 :(得分:0)

不,您需要使用方法语法。无法在变量中提供表达式作为使用查询语法的方法的参数。