2012-04-17 68 views
1

我想設計一個LINQ查詢,在特定位置進行過濾。在我的用戶界面下拉列表中,該下拉列表中的第一個條目爲「所有網站」。因此,當查詢將「所有網站」視爲值時,它不應執行過濾器。這可能沒有多大意義,但這是我如何用SQL來做到這一點..C#lambda語句與快速測試

select * from table 
where ((location = @loc and @loc is not null) or (@loc is null)) 

這是我如何試圖在LINQ中做到這一點。

var dataSetB = db.Data 
.Where(j => loc != 'All Sites' && j.Location1.Description.Equals(loc)); 

的問題是,當用戶選擇「所有網站」 - 沒有結果的時候,我會期待不受位置篩選所有的返回結果。

有誰知道如何在一個LINQ語句中完成此操作?

例如下拉..

<All Sites> 
<Sydney> 
<New York> 
<London> 
+0

爲什麼你不想要嗎? – Likurg 2012-04-17 09:38:04

+0

我假設查詢縮短了,並且有更多的語句。如果你不想保持重複查詢,他的方法是有效的,恕我直言。 – Till 2012-04-17 09:49:37

回答

1

您的下拉通常不會剛剛文本,它通常會被綁定到文本/值對。因此,讀入New South Wales的文本條目將具有相應的值NSW。條目​​的值爲null。所以,你可以查詢更改爲:

public object GetMyStuff(string loc) 
{ 
    var dataSetB = db.Data 
        .Where(j => loc == null || j.Location1.Description == loc); 
} 

邏輯快捷鍵適用於表達,所以如果傳遞的LOC值不爲空的j.Location1.Description只會進行比較。

使用中性位置值很重要 - 您並不是真的想比較文字文本​​出於一系列原因。

0

只是用OR運營商查詢轉換爲LINQ:

var dataSetB = db.Data 
      .Where(j => loc == 'All Sites' 
         || j.Location1.Description.Equals(loc)); 
1

不完全肯定這將工作:

var dataSetB = db.Data 
    .Where(j => loc != 'All Sites' ? j.Location1.Description.Equals(loc) : true); 
0

試試這個

var dataSetB = db.Data; 
if (loc != 'All Sites') 
    dataSetB = dataSetB 
       .Where(j => loc != 'All Sites' && j.Location1.Description.Equals(loc)); 
0

使用if.. else,而不是像這樣:

var dataSetB = db.Data; 
if(dropdownlist.SelectedIndex != 0) 
     dataSetB = dataSetB.Where(j => j.Location1.Description.Equals(loc)); 

//loc should be the dropdown list value 
0

我不知道你想使用LINQ的「所有網站」的情況。

檢查下拉值==「所有網站」。

如果爲true,則使用整個數據集。
如果爲false,則執行LINQ查詢。

0

如果你想所有的結果,過濾器應該接受所有條目,所以正確的語法是我認爲:

var dataSetB = db.Data 
       .Where(j => loc == 'All Sites' || j.Location1.Description.Equals(loc));