在LinqPad中使用PredicateBuilder中的where子句用于创建动态Where子句

问题描述:

我想在启用PredicateBuilder的LinqPad中创建动态查询。在LinqPad中使用PredicateBuilder中的where子句用于创建动态Where子句

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

查询抛出LinqPad这个错误,当我尝试执行它:

不能键入 '串' 隐式转换为 'System.Linq.Expressions.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(); 
+1

我想,PredicateBuilder需要'IQueryable '。所以试试这一行 - 'var dynamicResult = from Orders.AsQueryable()。where(predicate)select o;'。只需检查并让我们知道... – 2014-09-06 18:32:39

+0

我认为问题出现在这条线上:predicate =(linqFilter),其中右侧变量是一个字符串被分配给另一个类型。你知道如何解决这个问题吗? – Sunil 2014-09-06 18:39:36

好吧试试这样。

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

正如你所说,你用linqfilter字符串。这意味着您需要动态构建表达式。因此,这里是一个good article in codeproject。请参阅该文章中的“Dynamic Where”部分。你肯定会从该部分获得提示。

+0

我想在PredicateBuilder的代码片段中使用像linqFilter这样的字符串。在你的例子中,你没有使用一个字符串,而是一个表达式。 – Sunil 2014-09-06 19:56:30

+0

@Sunil:我已经更新了我的答案...只要通过那篇文章。 – 2014-09-06 21:07:39