我一直在搜索如何进行动态查询,我发现的所有内容都在使用“方法语法”。
是否可以为“查询语法”创建动态谓词?
我试着用类似的东西
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;
有办法吗?
最佳答案
不知道自己需要什么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;
当然,这意味着委托(delegate)在客户端执行,而不是翻译成在服务器上运行的东西(即由提供者生成的 T-SQL 的一部分,如果现在确实发生的话)。如果您需要,您需要继续使用 Expression
并继续使用方法链语法:
var result = UnitOfWork.Localization.AsQueryable().Where(locClause);
我不认为有任何理由选择Predicate<T>
在 Func<T,bool>
, 除了 Predicate<T>
更明确 w.r.t.意图。
与方法链语法相比,使用查询语法也没有任何功能优势——只是可读性/可维护性。我经常发现,使用提供程序做任何复杂的事情通常会导致下降到方法链语法。我通常只使用带有 LINQ To Objects 的查询语法。
关于c# - LINQ - "Query Syntax"上的动态 Where 子句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26018840/