我想使用一个完全动态的 where 子句,linq
其中列、运算符以及匹配所有的值都是在运行时决定的。如果可能的话,请建议我如何使用它。我想做类似的事情:
ObjDataTable.AsEnumerable().Where(whereClause);
这里有两个可能的选项(可能还有更多):
动态 Linq允许您在运行时动态生成 LINQ 查询。
您可以针对任何 LINQ 数据提供程序(包括 LINQ to SQL、LINQ to Objects、LINQ to XML、LINQ to Entities、LINQ to SharePoint、LINQ to TerraServer 等)使用 DynamicQuery 库。动态查询库不使用语言运算符或类型安全的 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
PredicateBuilder是LinqKit库中的一个类。它是类型安全的,并允许您动态创建表达式。也许比Dynamic Linq更高的学习曲线,但值得一试。
在驱使您手动构建表达式树的所有事情中,对动态谓词的需求在典型的业务应用程序中是最常见的。幸运的是,可以编写一组简单且可重用的扩展方法,从根本上简化此任务。这就是我们 PredicateBuilder 类的作用。
您可以在运行时使用方法语法添加过滤:
var query = ObjDataTable.AsEnumerable();
if (condition)
query = query.Where(whereClause);
在这种情况下,您将拥有很好的强类型 whereClause(而不是字符串)。
您是否为此检查过 Dynamic Expression API(在 NuGet 上可用)。它看起来非常简单且易于使用?
如果这不起作用,您必须Expression
在运行时创建 's,这在我的经验中可能会很痛苦。
利用动态 LINQwhereClause
,因此您可以作为字符串传递