在Lambda表达式中检查null - LINQ

4

我正在尝试编写高级搜索的表达式。但是,我需要检查每个属性是否为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())
));

3
你尝试过检查 null 值了吗?(鉴于你使用了 && 和 || 的组合,我建议你明确地加上括号...) - Jon Skeet
你要检查哪些属性,如果它们为空,你会怎么做?请注意,c.Surname等属性可能会通过SQL由ORM处理,因此实际上不会在C#代码中进行测试。或者这全部都是LINQ-to-Objects吗? - Marc Gravell
@jc99 观察:既然你来这里寻求帮助,回答那些要求提供必要上下文以便“提供”正确信息的问题对你有利。 - Marc Gravell
2个回答

7
尝试以下代码,我基本上是将您所有的条件检查包含在括号中,以进一步增加易读性并确保您不会因编译器对巨大逻辑的解释而得到任何奇怪的结果。
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())));

1

试试这个:

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

来自MSDN

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


就我个人而言,我希望这个PeopleRepository.Get()使用某种ORM工具,这样它实际上并不会在.NET上执行;我想知道这是否只是测试模拟的问题。 - Marc Gravell

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接