日期时间 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;
在这种情况下,它将寻址一个常量,而不是一个成员。
我正在测试线程答案 中的实现,但我在尝试使用 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;
在这种情况下,它将寻址一个常量,而不是一个成员。