C# 在linq中使用任何条件处理WHERE中的空值

C# 在linq中使用任何条件处理WHERE中的空值,c#,linq,C#,Linq,我的问题是db对象可以有一个空描述,ofc linq将抛出任何空异常。我用它来搜索描述和标题 这是密码 string[] searchQry = searchString.Split(' '); searchQry = searchQry.Select(sq=> sq.ToLower()).ToArray(); searchResult = x.reportsInfo .Where(r => searchQry.Any(y =>

我的问题是db对象可以有一个空描述,ofc linq将抛出任何空异常。我用它来搜索描述和标题

这是密码

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
如果
说明
,则使用空传播运算符(
)来避免
空引用异常
,如果是
,则使用空合并运算符(
)来提供默认值(
在这种情况下为false

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

searchQry.Any(r => r.report.Description?.ToLower().Contains(y) ?? false 
                 || r.report.Title.ToLower().Contains(y))
如果您想在将标准应用于
标题
之前先将标准应用于每个
描述
,那么您需要坚持使用两个
单独调用的方法:

.Where(r => searchQry.Any(y => r.report.Description?.ToLower().Contains(y) ?? false)
     ||  searchQry.Any(y => r.report.Title.ToLower().Contains(y))).ToList();
另一种方法是在
Any
之前使用
Where
子句过滤掉
描述
为空的记录:

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

ofc
引发了什么异常?向数据库提交了什么SQL?
searchQry
中通常有多大(多少个条目)?
x
x.reportsInfo
的类型是什么?您正在使用实体框架吗?