2014-09-06 129 views
0

我想在啓用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

回答

2

好吧試試這樣。

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