3

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

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

我尝试使用类似的东西

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;

有没有办法做到这一点 ?

4

2 回答 2

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>over Func<T,bool>,除了Predicate<T>更明确的意图。

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

于 2014-09-24T19:12:01.163 回答
0

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

于 2014-09-24T14:19:19.417 回答