c# - LINQ - "Query Syntax"上的动态 Where 子句

标签 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;

有办法吗?

最佳答案

不知道自己需要什么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/

相关文章:

c# - 这些虚拟表有什么意义?

c# - 在序列化过程中动态控制 XML 元素名称

c# - 在 LINQ to SQL 中动态构造 "or"LIKE 查询

java - 使用可选参数在 HQL 中动态搜索查询?

php - 使用数组创建动态 MySQL 查询 - PHP

c# - 从 Windows Phone 应用程序中的 DownloadStringCompleted 处理程序填充和返回实体

c# winforms gdi+ - 将图像裁剪为其内容

c# - 按日期排序仅在 LINQ 中打印最新的 20 条记录

c# - Entity Framework 代码首先在 Controller 中使用上下文

sql - PLS-00382 : expression is of wrong type in Oracle cursor