gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 21:31:22 24 4
gpt4 key购买 nike

我的模型类 MyModel 具有 Nullable 属性:Field1。我正在尝试使用表达式树过滤基于 Field1MyModel 的可查询。我处理 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))}

这里,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)

关于c# - 如何使用表达式树过滤包含可为空类型的 IQueryable?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53332269/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com