在LinqPad中使用字符串where子句和PredicateBuilder来创建动态where子句

本文关键字:子句 where PredicateBuilder 创建 动态 LinqPad 字符串 | 更新日期: 2023-09-27 18:20:57

我正试图在启用PredicateBuilder的情况下在LinqPad中创建一个动态查询。

我首先为类似"(orderid>100 AND customerid<=100)"的查询创建一个与where子句相对应的字符串,然后尝试在使用PredicateBuilder构建LINQ查询时使用此字符串。动态查询由本文末尾给出的代码中的变量"dynamicResult"表示。查询位于SQL Server 2008 R2中Northwind数据库的Orders表上。

当我尝试执行该查询时,该查询在LinqPad中抛出以下错误:

无法将类型"string"隐式转换为'System.Linq.Expression.Expression>'

问题:如何在PredicateBuilder中使用类似"(orderid>100 AND customerid<=100)"的字符串过滤器?在尝试执行以下代码时,我从LinqPad中选择了"C#语句"。

我正在尝试为LINQ查询动态构建where条件。

int? orderParam = 100;
string orderOperator = ">=";
string linqFilter = "";
linqFilter= String.Format("{0} {1} {2}", "o.OrderID", orderOperator, orderParam);
linqFilter.Dump();
 var predicate = PredicateBuilder.False<Orders>();
 predicate = (linqFilter);
 var dynamicResult = from o in Orders.Where(predicate) select o;
 dynamicResult.Dump();

在LinqPad中使用字符串where子句和PredicateBuilder来创建动态where子句

好吧,试试这样的方法。

 var predicate = PredicateBuilder.False<Orders>();
 predicate = predicate.And(o => o.OrderID >= 100);
 var dynamicResult = from o in Orders.Where(predicate) select o;

正如您所说,您使用了linqfilter字符串。这意味着您需要动态地构建表达式。因此,这里有一篇代码项目中的好文章。请参阅该文章中的"动态位置"部分。你肯定从那一节得到了提示。