【问题标题】:checking for null in lambda expression - linq在 lambda 表达式中检查 null - 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 观察:既然您是来这里寻求帮助的,那么回答询问必要上下文以提供正确信息的问题对您有利跨度>

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


【解决方案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 一样执行无论如何;我想知道这是否只是测试模拟的问题
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多