在 lambda 表达式中检查 null - linq

Posted

技术标签:

【中文标题】在 lambda 表达式中检查 null - linq【英文标题】:checking for null in lambda expression - linq 【发布时间】:2013-03-02 15:34:31 【问题描述】:

我正在尝试为高级搜索编写表达式。但是,我需要检查每个属性是否为null,否则会抛出错误。

我在下面包含了没有检查空值的表达式。

使用 jQuery dataTables 输出结果。

filteredPeople = unitOfWork.PeopleRepository.Get().Where(c =>
   IdSearchable && c.personID.ToString().Contains(param.sSearch.ToLower())
   || surnameSearchable && c.Surname.ToLower().Contains(param.sSearch.ToLower())
   || firstNameSearchable && c.FirstName.ToLower().Contains(param.sSearch.ToLower())
   || genderSearchable && c.Gender.ToLower().Contains(param.sSearch.ToLower())
));

【问题讨论】:

那么您尝试检查 null 的内容是什么? (鉴于 && 和 || 你已经到了那里,我会开始明确地将它们括起来......) 您要检查哪些属性,如果它们为空,您会怎么做?请注意,c.Surname 等可能会由 ORM 通过 SQL 处理,因此实际上并未在 C# 代码中进行测试。还是这都是 LINQ-to-Objects? @jc99 观察:既然您是来这里寻求帮助的,那么回答询问必要上下文以提供正确信息的问题对您有利跨度> 【参考方案1】:

试试下面,我基本上将所有单独的条件检查都放在括号内,以进一步提高可读性,并确保编译器对 huge 逻辑的解释不会产生任何奇怪的结果。

filteredPeople = unitOfWork.PeopleRepository.Get()
                .Where(c => (IdSearchable
                        && c.personID != null
                        && c.personID.ToString().Contains(param.sSearch.ToLower()))
                    || (surnameSearchable 
                        && c.Surname != null
                        && c.Surname.ToLower().Contains(param.sSearch.ToLower()))
                    || (firstNameSearchable 
                        && c.FirstName != null
                        && c.FirstName.ToLower().Contains(param.sSearch.ToLower()))
                    || (genderSearchable 
                        && c.Gender != null
                        && c.Gender.ToLower().Contains(param.sSearch.ToLower())));

【讨论】:

【参考方案2】:

试试这个:

filteredPeople = unitOfWork.PeopleRepository.Get()
                .Where(c => (IdSearchable
                     && c.personID != null
                     && c.personID.ToString().Contains(param.sSearch.ToLower()))
                   ||
                     ....

来自MSDN

条件与运算符 (&&) 对其布尔操作数执行逻辑与,但仅在必要时计算其第二个操作数。

【讨论】:

就个人而言,我希望这个 PeopleRepository.Get() 使用某种 ORM 工具,在这种情况下,它实际上不会像 .NET 一样执行无论如何;我想知道这是否只是测试模拟的问题

以上是关于在 lambda 表达式中检查 null - linq的主要内容,如果未能解决你的问题,请参考以下文章

使用 lambda 表达式将 JSON 字段设置为 null

JDK 8 新特性

如何使用 lambda 表达式检查元素是不是存在?

具有可为空值的 lambda 表达式 - 始终为 false,因为 Guid 类型的值从不等于“null”

在NetCore上包含包含的Lambda表达式

深入理解 lambda表达式 与 Optional Null 源码解析(Java11 三)