(这最初是标题,表达式树将 DateTime 与 Nullable DateTime 进行比较,但正如公认的答案所示,这根本不是问题。)
我正在尝试构建一个表达式树来比较实体框架查询中的日期。在下面的示例中,'result' 是一个已传递给该方法的 IQueryable,而 DateFilter 是一个来自 UI 的对象,该对象具有可为空的 DateTime 字段、FirstDate、SecondDate 以及枚举、DateType 和 DateMode。
我见过很多类似的问题,共同点似乎是使用 Expression.Convert 来确保日期的类型正确。然而,我还是做错了,因为当我走到最后,而不是(System.Nullable'1[System.DateTime]$x.EffectiveDate >=
......我的表情有.Invoke(.Constant<TheClassIAmIn i.e., 'this'+<>c__DisplayClass47_0>('this'+<>c__DisplayClass47_0).resultFunc)( $x,
......
这是完整的片段:
var changeInfo = Expression.Parameter(typeof(MyEntity), "x");
var targetDate = Expression.Property(changeInfo, DateFilter.DateType.ToString());
var dateFilter = Expression.Parameter(typeof(MyDateFilter), "DateFilter");
var firstDate = Expression.Property(dateFilter, "FirstDate");
var secondDate = Expression.Property(dateFilter, "SecondDate");
// Note that FirstDate, SecondDate, and ActionDate are nullable,
// SubmittedDate and EffectiveDate are not.
var ge = Expression.GreaterThanOrEqual(Expression.Convert(targetDate, firstDate.Type), firstDate);
var tree =
Expression.Lambda<Func<MyEntity, MyDateFilter, bool>>
(ge, changeInfo, dateFilter);
var resultFunc = tree.Compile();
result = result.Where(x => resultFunc(x, MyDateFilter));
这个问题DateTime
与Nullable<DateTime>
比较没有共同之处。
你看到的表情是这样的:
Expression<Func<MyEntity, bool>> expr = x => resultFunc(x, MyDateFilter);
这是带有参数x
调用 resultFunc
变量的lambda 表达式,该变量包含类型的委托Func<MyEntity, MyDateFilter, bool>
。
您不应该引入产生不兼容 lambda 表达式的MyDateFilter
参数,也不应该编译委托并发出调用调用表达式。相反,您应该直接构建一个类型为 的 lambda 表达式Expression<Func<MyEntity, bool>>
。该MyDateFilter
值将作为Expression.Constant
:
var changeInfo = Expression.Parameter(typeof(MyEntity), "x");
var targetDate = Expression.Property(changeInfo, DateFilter.DateType.ToString());
// Assuming DateFilter is a field/property/variable of type MyDateFilter
var dateFilter = Expression.Constant(DateFilter);
var firstDate = Expression.Property(dateFilter, "FirstDate");
var secondDate = Expression.Property(dateFilter, "SecondDate");
var ge = Expression.GreaterThanOrEqual(
Expression.Convert(targetDate, firstDate.Type),
firstDate);
var predicate = Expression.Lambda<Func<MyEntity, bool>>(
ge, changeInfo);
result = result.Where(predicate);
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句