在运行时构造where子句

时间:2013-02-28 07:18:11

标签: c# linq

我想使用带有linq的完全动态的where子句,其中列,运算符以及匹配所有值的值在运行时决定。 如果可能的话,请建议我如何使用它。 我想做点什么:

ObjDataTable.AsEnumerable().Where(whereClause);

4 个答案:

答案 0 :(得分:4)

以下是两种可能的选择(可能还有更多):

LINQ动态查询库

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

  

您可以对任何LINQ数据提供程序使用DynamicQuery库(包括LINQ to SQL,LINQ to Objects,LINQ to XML,LINQ to Entities,LINQ to SharePoint,LINQ to 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);

注意:下载Dynamic LINQ库时,您需要引用的.dll将隐藏在以下路径中: .\LinqSamples\DynamicQuery\DynamicQuery\bin\Debug

LinqKit.PredicateBuilder

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

  

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

答案 1 :(得分:1)

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

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

在这种情况下你会有很好的强类型whereClause(而不是字符串)。

答案 2 :(得分:1)

您是否已检查动态表达式API(available on NuGet)。它看起来很简单易用?

如果这不起作用,你必须在运行时创建Expression,这可能会让我感到痛苦。

答案 3 :(得分:1)

使用dynamic LINQ,因此您可以将whereClause作为字符串

传递