在lambda表达式中检查null - linq

时间:2013-03-14 10:28:09

标签: c# asp.net-mvc linq jquery-datatables

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

2 个答案:

答案 0 :(得分:7)

尝试下面,我基本上将所有单独的条件检查包含在括号内,以进一步提高可读性,并确保在编译器解释巨大逻辑时不会得到任何奇怪的结果。 / p>

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 :(得分:1)

试试这个:

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

来自 MSDN

条件AND运算符(&&)执行其bool操作数的逻辑AND,但只在必要时才计算其第二个操作数。