c# - 在 linq 中使用 ANY 条件处理 WHERE 内的空值

标签 c# linq

我的问题是 db 对象可以有 null 描述,并且 ofc linq 将抛出 ANY 的 Null 异常。我用它来搜索描述和标题。

这是代码

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

尝试用三元条件运算符封装它。

最佳答案

怎么样:

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

这使用 null 传播运算符 (?) 来避免在 Descriptionnull 的情况下出现 NullReferenceException如果它是 null,那么我们使用 null 合并运算符 (??) 来提供默认值(在本例中为 false)。

顺便说一句,您可以将两个 Any 调用合并为一个:

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

如果您想先将条件应用于每个 Description,然后再将其应用于 Title,那么您需要坚持使用两个单独的 方法>任何调用:

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

另一种方法是在 Any 之前使用 Where 子句来过滤 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();

关于c# - 在 linq 中使用 ANY 条件处理 WHERE 内的空值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53564415/

相关文章:

c# - 在使用 ItemsSource 之前,项目集合必须为空

java - 在 OS X 上安装 Java 8 会影响需要 Java 7 的 Xamarin 吗?

c# - Linq Group 按日期和对象列表列出

c# - 使用 LINQ 创建 JSON 异常

c# - 关于 linq select 和 ToList() 的问题

c# - Automapper 是否应该与私有(private) setter OOB 一起使用?

c# - IIS 池回收、池重启、应用程序重启、web.config 更新 - 全局 asax

c# - ViewModels、CQRS 和实体

c# - 无法理解这个 IEnumerable<T>.ToArray() 示例

c# - 运行linq命令时出现Unrecognized attribute 'name'错误