我有一个具有Nullable
属性的模型类MyModel
:Field1
。我试图使用表达式树来过滤基于Field1
的MyModel
的可查询性。我处理的可为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
的第二字段。我试图确保Field1
和Field2
的时间跨度和小于给定值。
然而,当我尝试枚举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).Type
是typeof(object)
(,第二个更重要的是,它肯定不能转换为TimeSpan
(或任何不可为null的值类型(。
Field1
空值是什么意思还不太清楚。如果你想把它当作零,那么用代替上面的
Expression.Constant(TimeSpan.Zero)