2

我想使用一个完全动态的 where 子句,linq其中列、运算符以及匹配所有的值都是在运行时决定的。如果可能的话,请建议我如何使用它。我想做类似的事情:

ObjDataTable.AsEnumerable().Where(whereClause);
4

4 回答 4

4

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

LINQ 动态查询库

动态 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

LinqKit.PredicateBuilder

PredicateBuilderLinqKit库中的一个类。它是类型安全的,并允许您动态创建表达式。也许比Dynamic Linq更高的学习曲线,但值得一试。

在驱使您手动构建表达式树的所有事情中,对动态谓词的需求在典型的业务应用程序中是最常见的。幸运的是,可以编写一组简单且可重用的扩展方法,从根本上简化此任务。这就是我们 PredicateBuilder 类的作用。

于 2013-02-28T07:22:00.450 回答
1

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

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

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

于 2013-02-28T07:20:08.943 回答
1

您是否为此检查过 Dynamic Expression API(在 NuGet 上可用)。它看起来非常简单且易于使用?

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

于 2013-02-28T07:21:20.593 回答
1

利用动态 LINQwhereClause ,因此您可以作为字符串传递

于 2013-02-28T07:21:28.003 回答