2016-01-08 37 views
0

我试图实现搜索功能,但遇到问题时,有些字段未由用户填写。Linq跳过查询,如果字符串为空

string country = searchCountry.Text.ToLower(); 
string state = searchState.Text.ToLower(); 

var searchLocation= (from h in db.Locations where (!string.IsNullOrWhiteSpace(country) ? h.Country.ToLower().Contains(country):false) 
       && (!string.IsNullOrWhiteSpace(state) ? h.State.ToLower().Contains(state) : false) 
       select h); 

的问题是,当字符串之一是空的searchLocation返回任何内容并只能当两个字段填写。我曾尝试更换& &与||但是它会得到结果,即使其中一个搜索项不在数据库中。

有没有办法做到这一点,除了Filtering out null values in a linq search

+0

你有什么反对*在linq搜索过滤出空值*? –

+0

@Gert我没有什么反对过滤空值,我只是希望有一种方法可以在一个语句中执行,而不是多个if语句。 – Question

+0

组合查询的优点是SQL语句可以更小并且不包含不必要的元素。 –

回答

0

这将返回国家为空或其匹配的任何位置,并且状态为空或匹配。

var searchLocation= (from h in db.Locations 
        where (string.IsNullOrWhiteSpace(country) || h.Country.ToLower().Contains(country)) 
          && (string.IsNullOrWhiteSpace(state) || h.State.ToLower().Contains(state)) 
        select h); 

这将有助于更多地描述你想要放入和放出什么,但这对我来说似乎合乎逻辑。

任何一个字段都是可选的,但它会过滤结果以包含匹配全部(一个或两个)填充字段的任何内容。

当然,如果你运行这个没有任何过滤器,它会返回所有位置。因此,如果您向数据库发出请求,请记住这一点。如果这是所期望的行为,那么事先将所有数据拉到列表中,而不是在每次输入任何内容时都要查询。

+0

谢谢,完美的作品,我只需要记住添加检查,如果所有的过滤器都是空的。 – Question

+0

@ user2974900是的,我可能只是在外面做,就像一些人在'if'块中提到的那样。我不知道这是不是你的意思,但你*可以*把它放在查询本身,但这将是不必要的开销。 –

0

我相信你这个得太多。只需在搜索前验证字段:

string country = searchCountry.Text.ToLower(); 
string state = searchState.Text.ToLower(); 

if(string.IsNullOrWhitespace(state) || string.IsNullOrWhitespace(country)) 
{ 
    //MessageBox.Show... 
    return; 
} 

var searchLocation= //query with validated fields 

在尝试对它执行操作之前验证输入是一个非常好的主意。它使您的代码比结合两者更具可读性。