繁体   English   中英

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

[英]How to filter IQueryable containing nullable types using expression trees?

我有一个具有Nullable属性的模型类MyModelField1 我试图使用表达式树过滤基于Field1MyModel的可查询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))}

在这里, Field2long类型的第二个字段。 我试图确保Field1Field2的时间总和小于给定值。

但是,当我尝试枚举可查询对象时,在大约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)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM