我想使用带有linq
的完全动态的where子句,其中列,运算符以及匹配所有值的值在运行时决定。
如果可能的话,请建议我如何使用它。
我想做点什么:
ObjDataTable.AsEnumerable().Where(whereClause);
答案 0 :(得分:4)
以下是两种可能的选择(可能还有更多):
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
PredicateBuilder是LinqKit库中的一个类。它是类型安全的,允许您动态创建表达式。也许是比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
作为字符串