[英]How to filter IQueryable containing nullable types using expression trees?
我有一个具有Nullable
属性的模型类MyModel
: Field1
。 我试图使用表达式树过滤基于Field1
的MyModel
的可查询MyModel
。 我处理可为空的部分如下:
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
的时间总和小于给定值。
但是,当我尝试枚举可查询对象时,在大约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)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.