日期时间 lambda 表达式

DateTime lambda expressions

我正在测试线程答案 中的实现,但我在尝试使用 DateTime 解析表达式时遇到错误,例如:t => t.Name == "NAME" && t.OpeningDate == DateTime.Now

这是构建 DateTime lambda 表达式的正确方法吗?如果我创建像 Expression<Func<Model, bool>> expression = t => t.Name == "NAME" 这样的表达式,结果是正确的。

有什么问题吗?

如果你可以构建t => t.Name == "NAME"表达式,下一步就是通过Expression.And将它与t.OpeningDate == DateTime.Now结合起来。试试这个代码:

var t = Expression.Parameter(typeof(Model), "t");
var body = Expression.And(
    Expression.Equal(Expression.PropertyOrField(t, "Name"), Expression.Constant("NAME")),
    Expression.Equal(Expression.PropertyOrField(t, "OpeningDate"), Expression.Constant(DateTime.Now))
);
var predicate = Expression.Lambda<Func<Model, bool>>(body, t);

您需要改进当前的解决方案以支持成员,特别是您需要改进VisitMember。现在它只是抛出一个 NotSupportedException.

作为解决方法,您可以先将其解压缩:

DateTime now = DateTime.Now;
var expression = t => t.Name == "NAME" && t.OpeningDate == now;

在这种情况下,它将寻址一个常量,而不是一个成员。