代码之家  ›  专栏  ›  技术社区  ›  kovac

如何使用表达式树过滤包含可空类型的IQueryable?

  •  2
  • kovac  · 技术社区  · 6 年前

    我有模型课 MyModel 用一个 Nullable 财产: Field1 . 我正在尝试过滤可查询的 基于 字段1 使用表达式树。第一部分handle nullable如下所示:

    var memEx = Expression.Property(parameterEx, "Field1");
    
    var memberEx = Expression.Condition(
        Expression.Property(memEx , "HasValue"),
        Expression.Property(memEx, "Value),
        ConvertExpressionType(Expression.Constant(null), typeof(TimeSpan))
    )
    

    ConvertExpressionType() 转换表达式的类型,以便可以与一起使用 Condition 表情。

    在调试中,完整的可查询项如下所示:

    {System.Collections.Generic.List`1[MyModel].Where(x => ((IIF(x.Field1.HasValue, x.Field1.Value, Convert(null, TimeSpan)) + x.Field2.ToTimeSpan()) < 06:49:08.3313919))}
    

    在这里 Field2 long . 我正在努力确定时间跨度的总和 字段1 字段2 小于给定值。

    然而,当我尝试枚举可查询项时,在大约2个元素之后,我得到 NullReferenceException . 如果我只是在表达式树中尝试一个伪值,而不是 null

    var memEx = Expression.Property(parameterEx, "Field1");
    
    var memberEx = Expression.Condition(
        Expression.Property(memEx , "HasValue"),
        Expression.Property(memEx, "Value),
        ConvertExpressionType(Expression.Constant(TimeSpan.FromHours(1)), typeof(TimeSpan))
    )
    

    所以,我猜,我在条件表达式中做错了什么。我如何解决这个问题(或者准确地找出导致异常的原因)?

    1 回复  |  直到 6 年前
        1
  •  3
  •   Ivan Stoev    6 年前

    ConvertExpressionType(Expression.Constant(null), typeof(TimeSpan))
    

    因为首先 null Expression.Constant(null).Type typeof(object) 但是)第二个也是更重要的是,当然不能转换为 TimeSpan (或任何 ).

    现在还不太清楚是什么造成的 Field1

    Expression.Constant(TimeSpan.Zero)