我的问题是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();
尝试使用三元条件运算符将其封装。
答案 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();