2015-05-28 49 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})那么这是不可能的。

相关问题