在Linq中使用ANY条件处理WHERE内部的空值

时间:2018-11-30 20:24:41

标签: c# linq

我的问题是db对象可以有一个空描述,ofc linq将使用ANY抛出Null Exception。我正在用它来搜索描述和标题。

这是代码

string[] searchQry = searchString.Split(' ');            
searchQry = searchQry.Select(sq=> sq.ToLower()).ToArray();

searchResult = x.reportsInfo
    .Where(r => 
        searchQry.Any(y => r.report.Description.ToLower().Contains(y)) ||
        searchQry.Any(y => r.report.Title.ToLower().Contains(y)))
    .ToList();

尝试使用三元条件运算符将其封装。

1 个答案:

答案 0 :(得分:2)

怎么样:

 y => r.report.Description?.ToLower().Contains(y) ?? false

?NullReferenceException的情况下,它使用空传播运算符(Description)来避免null,如果它是null,则使用空合并运算符(??)以提供默认值(在这种情况下为false)。

您可以将两个Any调用合并为一个:

searchQry.Any(r => r.report.Description?.ToLower().Contains(y) ?? false 
                 || r.report.Title.ToLower().Contains(y))

如果您想先在每个Description上应用该标准,然后再在Title上应用它,则需要坚持两次单独的Any调用的方法:< / p>

.Where(r => searchQry.Any(y => r.report.Description?.ToLower().Contains(y) ?? false)
     ||  searchQry.Any(y => r.report.Title.ToLower().Contains(y))).ToList();

另一种方法是在Where之前使用Any子句来过滤掉Description为空的记录:

searchResult = x.reportsInfo
                 .Where(r => searchQry.Where(r => r.report.Description != null)
                                      .Any(y => r.report.Description.ToLower().Contains(y))
                     ||searchQry.Any(y => r.report.Title.ToLower().Contains(y)))                                        
                .ToList();