C# 如果字符串为空,则Linq跳过查询

C# 如果字符串为空,则Linq跳过查询,c#,linq,linq-to-sql,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(countr

我试图实现一个搜索功能,但是当一些字段没有被用户填写时,我遇到了问题

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将不返回任何内容,仅在两个字段都已填充时才起作用。我已尝试将&&替换为| |,但它将得到结果,即使其中一个搜索词不在数据库中


除了

我相信你想得太多了,还有什么办法可以做到这一点吗。只需在搜索前验证字段:

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

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

这将返回任何国家为空或匹配的位置,以及状态为空或匹配的位置

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);
这将有助于有一个多一点的描述什么,你想投入和退出,但这似乎是合乎逻辑的对我来说

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


当然,如果您在没有任何筛选器的情况下运行此操作,它将返回所有位置。因此,如果您向数据库发出请求,请记住这一点。如果这是您想要的行为,那么最好事先将所有数据拉入列表,而不是每次键入任何内容时都进行查询。

您对在linq搜索中过滤空值有何异议?@Gert我不反对过滤空值,我只是希望有一种方法可以在一个语句而不是多个if语句中完成。组合查询的优点是SQL语句可以更小,并且不包含不必要的元素。谢谢,效果很好,我只需要记住在所有筛选器都为空时添加检查。@user2974900是的,正如一些人所建议的那样,我可能只是在一个
if
块的外面做。我不知道这是否是您的意思,但您可以将其放在查询本身中,但这将是不必要的开销。