在 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