如何使用表达式树筛选包含可为null类型的IQueryable



我有一个具有Nullable属性的模型类MyModelField1。我试图使用表达式树来过滤基于Field1MyModel的可查询性。我处理的可为null的部分如下:

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的第二字段。我试图确保Field1Field2的时间跨度和小于给定值。

然而,当我尝试枚举queryable时,在大约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))
)

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

如果不检查,我会说问题出在

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

因为第一个null常量没有类型(不过Expression.Constant(null).Typetypeof(object)(,第二个更重要的是,它肯定不能转换为TimeSpan(或任何不可为null的值类型(。

Field1空值是什么意思还不太清楚。如果你想把它当作零,那么用代替上面的

Expression.Constant(TimeSpan.Zero)

最新更新