如果真的有做作为一个单一的查询,则:
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})
那么这是不可能的。
这些似乎更正确,因为它会产生更好的查询,然后我的版本。 –