2015-05-28 51 views
2

您好我有一些LINQ代碼需要運行,但是標準取決於我傳遞給函數的國家變量是否爲null。將兩個LINQ語句合併爲一個

因此,如果該國的變量是空我想運行: -

var resorts = from r in db.WRESORT 
         where new[] { "AUSTRIA", "FRANCE", "ITALY" }.Contains(r.COUNTRY) 

,如果國家有一個值,我想運行

var resorts = from r in db.WRESORT where r.COUNTRY == country 

的問題是,是否有辦法把這兩個陳述合併爲一個?

感謝

回答

1

可能是這樣?:

var resorts = from r in db.WRESORT 
       where (country != null && r.COUNTRY == country) || 
        (country == null && new[] { "AUSTRIA", "FRANCE", "ITALY" }.Contains(r.COUNTRY)) 
5

您可以使用檢查country已經值,則使用country使用預定義的列表

var arr = string.IsNullOrEmpty(country) 
    ? new[] { "AUSTRIA", "FRANCE", "ITALY" } 
    : new[] { country }; 

var resorts = from r in db.WRESORT where arr.Contains(r.COUNTRY); 
+1

這些似乎更正確,因爲它會產生更好的查詢,然後我的版本。 –

-1

路口否則創建創建磁盤陣列:

var resorts = 
from r in db.WRESORT 
where new[] { "AUSTRIA", "FRANCE", "ITALY" }.Contains(r.COUNTRY) && r.COUNTRY == country; 

工會:

var resorts = from r in db.WRESORT 
         where new[] { "AUSTRIA", "FRANCE", "ITALY" }.Contains(r.COUNTRY) || r.COUNTRY == country; 
+0

這是錯誤的。如果country == null的第一個版本會失敗。第二個版本將返回所有澳大利亞,法國,意大利和巴西如果contry ==巴西,但OP只想巴西 –

1

如果真的有做作爲一個單一的查詢,則:

var resorts = from r in db.WRESORT 
    where (
    country == null ? new[] { "AUSTRIA", "FRANCE", "ITALY" } : new[]{country}) 
    .Contains(r.COUNTRY); 

但是,爲什麼不:

var resorts = country == null 
    ? from r in db.WRESORT 
    where (new[] { "AUSTRIA", "FRANCE", "ITALY" }.Contains(r.COUNTRY) 
    : from r in db.WRESORT where r.COUNTRY == country; 

許多數據庫和其他提供者可以通過一次相等檢查(=)比包含(IN (…)),並且由於查詢的類型將會是相同的任何方式,這將工作,併產生相同類型的查詢。代碼分支在linq-y位之外發生什麼危害?

在這種情況下,你也可以去更具可讀性:

IQueryable<Resort> resorts; 
if(country == null) 
    resorts = from r in db.WRESORT 
    where (new[] { "AUSTRIA", "FRANCE", "ITALY" }.Contains(r.COUNTRY); 
else 
    resorts = from r in db.WRESORT where r.COUNTRY == country; 

因爲IQueryable的類型參數是不是匿名的。如果你有類似.Select(r => new{r.COUNRY, r.Name})那麼這是不可能的。

相關問題