C# LINQ-关于“的动态Where子句”;查询语法";

C# LINQ-关于“的动态Where子句”;查询语法";,c#,linq,dynamicquery,C#,Linq,Dynamicquery,我一直在搜索如何进行动态查询,我发现的一切都是使用“方法语法” 是否可以为“查询语法”创建动态谓词? 我试着用类似于 表达式 在谓词内部,但编译器返回以下消息 "Cannot convert Expression<Func<TEntity, bool>> to bool" “无法将表达式转换为bool” 它适用于“方法语法”,但不适用于“查询语法” 它的工作原理是: Expression<Func<Localization, bool>> lo

我一直在搜索如何进行动态查询,我发现的一切都是使用“方法语法”

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

我试着用类似于

表达式

在谓词内部,但编译器返回以下消息

"Cannot convert Expression<Func<TEntity, bool>> to bool"
“无法将表达式转换为bool”
它适用于“方法语法”,但不适用于“查询语法”

它的工作原理是:

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

var results = UnitOfWork.Localization.AsQueryable().Where(locClause).ToList();
Expression 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 locClause=(l=>l.id==locId);
var result=来自UnitOfWork.Localization.AsQueryable()中的l
where LOC子句
选择l;

有办法做到这一点吗?

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

不知道您需要表达式做什么,我不能确定这会满足您的所有需要。使用
AsQueryable
让我怀疑您没有(如果您直接查询提供者,您应该已经是
IQueryable
);但是,你必须确认一下。但是,如果不需要使用
表达式
,可以执行以下操作:

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

var result = from l in UnitOfWork.Localization.AsQueryable()
                          where locClause(l)
                          select l;
我不认为有任何理由选择
Predicate
而不是
Func
,除了
Predicate
对意图更为明确


与方法链语法相比,使用查询语法也没有任何功能上的好处——只是可读性/可维护性。我经常发现,对提供者进行任何复杂的操作通常会导致方法链语法的下降。我通常只在LINQ To对象中使用查询语法。

表达式不能在查询语法中传递到LINQ子系统并在运行时得到处理,您必须在编译时处理它(即编译它)。但是,只使用
Func
(或
谓词
)和
where locClause(l)
会更容易些。你能给我举个例子吗?真的吗?因此,没有办法使用查询语法进行动态查询?@ViniciusDefeo与您尝试使用它们的方式不同,没有。
Predicate<Localization> locClause = l => l.id == locId;

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