表达式树生成不需要的调用

凯利克莱恩

(这最初是标题,表达式树将 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));
伊万·斯托耶夫

这个问题DateTimeNullable<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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

正则表达式不需要

错误条件表达式中不需要使用布尔文字,不需要三进制

为什么lambda表达式不需要<functional>,而function <void()>却需要?

如何使 Vim 在正则表达式控制字符之前不需要反斜杠

为什么在Linq表达式中使用String.contains时,不需要括号?

ModelMapping流,而不需要一个Lambda表达式

使用正则表达式删除字符串中不需要的字符

无法使用正则表达式去除不需要的项目

带有折叠表达式的模板会创建不需要的参数副本

使用正则表达式从R中删除不需要的html标签

此处不需要方法引用表达式,编译时错误

如何阻止正则表达式匹配不需要的空字符串?

如何使用正则表达式过滤字符串中不需要的字符?

从正则表达式中删除不需要的匹配项

使用正则表达式和或为了摆脱不需要的字符

删除字符串的不需要的部分。正则表达式/ JS

有条件的正则表达式-不需要的输出

用正则表达式替换不需要的字符

正则表达式从文本文件中捕获不需要的数字

Javascript split()正则表达式在Chrome中返回不需要的逗号

Java,正则表达式,去除不需要的字符[后跟,前导,之间]

不需要constexpr函数来返回常量表达式吗?

使用正则表达式从字符串中删除不需要的字符组

使用正则表达式从字符串中删除不需要的字符

为什么返回表达式在不需要时使用分号?

从AC#表达式中删除不需要的拳击转换

从表达式函数中删除不需要的符号-R

正则表达式匹配包含不需要的字符

正则表达式捕获不需要的字符串