在运行时构造where子句

本文关键字:where 子句 运行时 | 更新日期: 2023-09-27 18:01:42

我想使用一个完全动态的带有linq的where子句,其中列,操作符以及要匹配的值都是在运行时决定的。如果可能的话,请告诉我如何使用它。我想这样做:

ObjDataTable.AsEnumerable().Where(whereClause);

在运行时构造where子句

这里有两个可能的选项(可能还有更多):

LINQ动态查询库

Dynamic Linq允许您在运行时动态生成Linq查询。

你可以使用DynamicQuery库对任何LINQ数据提供程序(包括LINQ到SQL, LINQ到对象,LINQ到XML, LINQ到实体,LINQ到SharePoint, LINQ到TerraServer,等等)。与使用语言操作符或类型安全的lambda扩展方法构造LINQ查询不同,动态查询库为您提供了基于字符串的扩展方法,您可以将任何字符串表达式传递给这些方法。

using System.Linq.Dynamic; //Make sure you reference Dynamic.dll
string whereClause = "CategoryID=2 AND UnitPrice>2";
ObjDataTable.AsEnumerable().AsQueryable().Where(whereClause);

注意:当你下载动态LINQ库时,你需要引用的.dll隐藏在以下路径下: .'LinqSamples'DynamicQuery'DynamicQuery'bin'Debug

LinqKit。PredicateBuilder

PredicateBuilder是LinqKit库中的一个类。它是类型安全的,允许动态创建表达式。也许比Dynamic Linq学习曲线更高,但值得一试。
在所有促使您手动构造表达式树的因素中,对动态谓词的需求在典型的业务应用程序中是最常见的。幸运的是,可以编写一组简单且可重用的扩展方法,从而从根本上简化此任务。这是我们的PredicateBuilder类的角色。

您可以在运行时使用方法语法添加过滤:

var query = ObjDataTable.AsEnumerable();
if (condition)
    query = query.Where(whereClause);

在这种情况下,您将有一个很好的强类型的whereClause(而不是字符串)。

您检查过动态表达式API(在NuGet上可用)吗?它似乎很直接,很容易使用?

如果这不起作用,您必须在运行时创建Expression,这在我的经验中可能是一种痛苦。

使用动态LINQ,所以你可以传递whereClause作为字符串