如果真的有做作爲一個單一的查詢,則:
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})
那麼這是不可能的。
這些似乎更正確,因爲它會產生更好的查詢,然後我的版本。 –