【问题标题】:Where Predicates in LINQLINQ 中的谓词在哪里
【发布时间】:2019-05-14 11:09:42
【问题描述】:

如何在 LINQ 中的 Where 谓词中指定条件而不会出现空引用异常。例如,如果q 是一个 IQueryable 我该怎么做:

Expression<Func<ProductEntity,bool>> predicate = p => !search.CategoryId.HasValue || (search.CategoryId.HasValue && search.CategoryId == p.CategoryId);

var q2 = q.Where(predicate);

这里的search 是一个对象,它包含可能的搜索条件,这些条件可能会设置也可能不会像搜索一样设置。CategoryId 可能未设置,但如果是,我想获取由该条件设置的产品。

当我这样做时,我得到空引用异常。

【问题讨论】:

    标签: c# linq


    【解决方案1】:

    您可以使用null-coalescing operator ?? 将可能的空值替换为默认值。以下集合尝试匹配 search.Category(如果存在)或简单地创建“始终为真”的表达式。这将由任何好的 Linq 查询提供程序(例如 LinqToSql)进行优化。

    Expression<Func<ProductEntity,bool>> predicate = p => (search.CategoryId ?? p.CategoryId) == p.CategoryId);
    
    var q2 = q.Where(predicate);
    

    另一种可能性是使用PredicateBuilder 动态组合查询谓词。这就是我使用与您使用的相似模式进行搜索的方式:

    var predicate = PredicateBuilder.True<Order>();
    
    if (search.OrderId))
    {
       predicate = predicate.And(a => SqlMethods.Like(a.OrderID, search.OderID);  
    }
    // ...
    var results = q.Where(predicate);
    

    【讨论】:

      【解决方案2】:

      让我们剖析一下这条线:

      Expression<Func<ProductEntity,bool> predicate = p => !search.CategoryId.HasValue
             || (search.CategoryId.HasValue && search.CategoryId == p.CategoryId)
      var q2 = q.Where(predicate);
      

      那么我们有多少种方法可以解决null 问题呢?

      • search(你的“捕获”变量)可能是null
      • p 可以为 null,表示列表中有 null
      • 您已经处理search.CategoryId 成为null (Nullable&lt;T&gt;) 的情况
      • 但也许p.CategoryId(列表中记录上的类别)是nullNullable&lt;T&gt;) - 但是,我不确定这会导致NullReferenceException
      • q(列表/来源)可以是null

      所以:在 5 个选项中,您排除了 1 个;看看其他4个? 这个问题很可能是由代码中没有显示的不可见的东西引起的;例如get 可能是:

      public int? CategoryId {
          get {return innerObject.CategoryId;}
      }
      

      innerObject 可以是null;如果您消除了其他 4 个(很容易做到),请将此作为最后的手段。

      【讨论】:

        猜你喜欢
        • 2018-12-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-10-12
        • 2012-07-25
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多