2009-10-30 163 views
2

我有一個包含多個位列的產品信息表。該表格可以從每個列有複選框的界面查詢。複選框分爲幾個相關的組。刪除Linq查詢中的WHERE子句

例如,三列描述產品適用於各種市場的適用性,即汽車,航空和海洋。

如果沒有選中這些複選框,我想要執行下面的SQL。

​​

如果汽車被選中下面的SQL應執行

SELECT * FROM Products WHERE Automotive = 1 

,如果超過一個被選中我喜歡的選項進行邏輯或運算,

SELECT * FROM Products WHERE 
    Automotive = 1 
    OR 
    Aviation = 1 

在好的舊C#& SQL我可以通過有條件地將SQL連接在一起來實現這個邏輯,但是我在用Linq生成相同的邏輯時遇到了麻煩。

我的問題是如何有條件地將WHERE子句及其元素添加到我的查詢中。

我寧願只有一個點執行查詢,所以如果可能的話,我想避免使用C#如果的分支到不同的查詢。

+0

這有幫助嗎? http://stackoverflow.com/questions/1450983/linq2sql-or-and-operators-anded-ored-conditions – 2009-10-30 21:24:45

回答

6

我會用這個PredicateBuilder

var query = db.GetTable<Products>().AsQueryable(); 

var predicate = PredicateBuilder.False<Products>(); 
if (automotive.Checked) 
{ 
    predicate = predicate.Or(p => p.Automotive == 1); 
} 
if (aviation.Checked) 
{ 
    predicate = predicate.Or(p => p.Aviation == 1); 
} 
query = query.Where(predicate); 
+1

+1對於真棒 – 2009-10-30 17:16:51

+0

正是!這個PredicateBuilder是光滑的! – 2009-10-30 17:29:22

3

使值爲「或」而不是「和」使得這個問題更加困難。如果是「和」,那麼下面應該做的罰款

public IEnumerable<Products> GetQuery() { 
    var query = db.GetTable<Products>(); 
    if (automotiveBox.Checked) { 
    query = query.Where(x => x.Automotive == 1); 
    } 
    if (aviation.Checked) { 
    query = query.Where(x => x.Aviation == 1); 
    } 
    return query 
} 

有了它作爲一個「或者」雖然我認爲你唯一的選擇是用手工建立表達式樹,並把它作爲一個Where子句。

+0

這不會爲「或」情況下工作?我相信多個where條件將被簡單地組合成生成的SQL中的一個Where子句。 http://stackoverflow.com/questions/1280871/multiple-defered-where-clause-expressions-in-linq-to-sql似乎支持這一點。 – 2009-10-30 16:40:49

+1

是的,但它們將在生成的SQL中形成「AND」情況。你實際上正在做A和B的地方,其中B和C不在哪裏(A或B或C),因爲這需要不同的樣式SQL語句。 – 2009-10-30 16:42:17

3

如果您嘗試使用「OR」語句檢查單個列,則可以使用Contains來完成此操作。這是一個good blog post顯示這是如何工作的。

但是,如果您嘗試動態檢查不同的列,這將不起作用。在這種情況下,可能需要多個語句。