2012-01-03 89 views
33

我想做一個LINQ語句,where子句來自一個變量。例如:C#Linq where子句作爲變量

string whereClause = address.zip == 23456; 
var x = from something in someList where whereClause; 

這可能嗎?我似乎無法得到它的工作。

感謝,

更新 - 我的where子句是預定義的,將根據用戶輸入的,所以我不認爲這會爲我工作。基本上,在方法中沒有構造Clause的地方,它是LINQ的方法的一個參數。我沒有解釋,以及這是一個更好的例子:

public void doLnq(string whereClause) 
{ 
    var x = from something in someList where whereClause; 
    dowork(x); 
} 

更新 - 只是總結一些建議,集中一切。

我不能使用開關來生成where子句,因爲有很多可能性。

您已經發布了一些動態linq帖子看起來很有前途,但是我有麻煩將linq轉換爲sql示例到我的linq到對象問題。翻翻MSDN http://msdn.microsoft.com/en-us/library/bb353734.aspx我有麻煩搞清楚你的​​意思是使用AsQueryable已

感謝,

+0

呃,沒有。 where子句只是* not *一個字符串,它是一個返回布爾值的表達式。除......看到SLaks的鏈接! – sq33G 2012-01-03 21:22:54

+0

@ sq33G在這種情況下的字符串將是「address.zip == 23456」我想用作表達式。該字符串來自用戶輸入,因此他們可以進行自定義搜索。那有意義嗎? – kds6253 2012-01-03 21:25:32

+0

我猜測用戶正在從下拉菜單中選擇字段(字段==值)。所以你可以使用switch語句來構建一個Func 作爲Where委託來發送。 – sq33G 2012-01-03 21:29:08

回答

49

和@sLaks你需要組裝的Expression<Func<T, bool>>並把它傳遞給Where()擴展方法:

Expression<Func<T, bool>> whereClause = a => a.zip == 23456; 
var x = frSomeList.Where(whereClause); 

編輯:如果您使用LINQ到對象,刪除該單詞Expression創建n普通代表。

+1

使用'linq-to-objects'標籤,表達式*是否合適? – 2012-01-03 21:01:45

+0

請參閱更新 – kds6253 2012-01-03 21:06:21

+0

@ kds6253:然後您可以將委託作爲參數。如果你需要使用一個字符串,你可以使用動態LINQ(但速度會更慢) – SLaks 2012-01-03 21:08:50

9

此:

var query = from something in someList where whereClause; 

是簡寫:

var query = someList.Where(something => whereClause); 

假設someListIEnumerable<Address>WhereEnumerable.Where Extension Method。此方法預計您可以定義如下的Func<Address, bool>

Func<Address, bool> whereClause = address => address.Zip == 23456; 
var query = someList.Where(whereClause); 
+0

請參閱更新 – kds6253 2012-01-03 21:05:45

0

如果要在運行時定義Where子句,則需要使用動態查詢。

斯科特谷寫了一個偉大的職位約在這裏:http://weblogs.asp.net/scottgu/archive/2008/01/07/dynamic-linq-part-1-using-the-linq-dynamic-query-library.aspx

希望有所幫助。

+0

我以前看過這篇文章,我不太明白如何將它應用於我的情況。我對此比較陌生,所以請耐心等待。他使用的例子是LINQ to Sql我相信和數據源是Northwind數據庫。我怎樣才能改變這與我的Linq to Object問題一起工作?一旦我再次感謝幫助。 – kds6253 2012-01-03 21:22:12

3

正如理查德指出的,動態查詢庫可用於構建動態過濾器表達式。當使用Linq-To-Objects時,請務必先將IEnumerable<T>轉換爲IQueryable<T>。這裏是一個(不完整的)例子:

using System.Linq.Dynamic; 

namespace System.Linq.Dynamic 
{ 
    public class Example 
    { 
    // Assuming some value is assigned to below field somewhere... 
    private IEnumerable<Address> m_Addresses; 

    public void FilterByZipCode(string zipCode) 
    { 
     var x = m_Addresses.AsQueryable().Where("Zip == @0", zipCode); 
     dowork(x); 
    } 
    } 

    public class Address 
    { 
    public String Zip { get; set; } 

    // More Properties... 
    } 
}