如果string为Null,则Linq跳过查询

时间:2016-01-08 21:23:54

标签: c# linq linq-to-sql

我正在尝试实现搜索功能,但在用户未填写某些字段时遇到问题。

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

之外,有没有办法做到这一点

2 个答案:

答案 0 :(得分: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

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

答案 1 :(得分: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);

对你想要放入和放弃的内容进行更多描述会有所帮助,但这对我来说似乎是合乎逻辑的。

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

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