如果字符串为Null,则Linq跳过查询

本文关键字:Linq 查询 字符串 Null 如果 | 更新日期: 2023-09-27 18:29:37

我正在尝试实现一个搜索函数,但当用户没有填写某些字段时遇到了问题。

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什么也不返回,只有当两个字段都被填充时才起作用&使用||,但它会得到结果,即使其中一个搜索项不在数据库中。

除了在linq搜索中过滤空值之外,还有什么方法可以做到这一点吗

如果字符串为Null,则Linq跳过查询

这将返回任何国家/地区为空或匹配、状态为空或相匹配的位置。

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);

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

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

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

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

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

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