C# 日期时间lambda表达式

C# 日期时间lambda表达式,c#,lambda,expression,expression-trees,linq-expressions,C#,Lambda,Expression,Expression Trees,Linq Expressions,我在线程回答中测试了实现,但是我在尝试解析带有DateTime的表达式时出错,例如:t=>t.Name==“Name”&&t.OpeningDate==DateTime.Now 这是构建DateTime lambda表达式的正确方法吗?如果我创建一个像expression=t=>t.Name==“Name”这样的表达式,结果是正确的 有什么问题吗?如果您可以构建t=>t.Name==“Name”表达式,下一步是将它与t.OpeningDate==DateTime.Now通过expression.

我在线程回答中测试了实现,但是我在尝试解析带有
DateTime
的表达式时出错,例如:
t=>t.Name==“Name”&&t.OpeningDate==DateTime.Now

这是构建DateTime lambda表达式的正确方法吗?如果我创建一个像
expression=t=>t.Name==“Name”
这样的表达式,结果是正确的


有什么问题吗?

如果您可以构建
t=>t.Name==“Name”
表达式,下一步是将它与
t.OpeningDate==DateTime.Now
通过
expression.And
组合。请尝试以下代码:

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);
var t=Expression.Parameter(typeof(Model),“t”);
var body=表达式。和(
Expression.Equal(Expression.PropertyOrField(t,“Name”)、Expression.Constant(“Name”),
Expression.Equal(Expression.PropertyOrField(t,“OpeningDate”)、Expression.Constant(DateTime.Now))
);
var谓词=表达式.Lambda(body,t);

如果您可以构建
t=>t.Name==“Name”
表达式,下一步是将其与
t.OpeningDate==DateTime.Now
通过
expression.And
组合。请尝试以下代码:

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);
var t=Expression.Parameter(typeof(Model),“t”);
var body=表达式。和(
Expression.Equal(Expression.PropertyOrField(t,“Name”)、Expression.Constant(“Name”),
Expression.Equal(Expression.PropertyOrField(t,“OpeningDate”)、Expression.Constant(DateTime.Now))
);
var谓词=表达式.Lambda(body,t);

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

作为一种解决方法,您可以先提取它:

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

在这种情况下,它将处理一个常量,而不是一个成员

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

作为一种解决方法,您可以先提取它:

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

在这种情况下,它将处理一个常量,而不是一个成员

您的
OpeningDate
是日期时间对象还是唯一的日期?如果只是日期,那么使用
DateTime.Now.ToShortDateString()
来比较错误是什么?
OpeningDate
DateTime
并且我不能使用
DateTime.Now.ToShortDateString()
来比较我认为它不会起作用。也许你想要DateTime.Today?
DateTime.Today
不起作用。尝试分析
DateTime时,错误出现在
受保护的重写表达式VisitMember(MemberExpression m)
中。今天
错误是
附加信息:不支持成员“今天”
您的
OpeningDate
是DateTime对象还是仅日期?如果只是日期,那么使用
DateTime.Now.ToShortDateString()
来比较错误是什么?
OpeningDate
DateTime
并且我不能使用
DateTime.Now.ToShortDateString()
来比较我认为它不会起作用。也许你想要DateTime.Today?
DateTime.Today
不起作用。错误出现在受保护的重写表达式VisitMember(MemberExpression m)中
尝试分析
DateTime.Today
时,错误是
附加信息:不支持成员“Today”
添加
DateTime now=DateTime.now
now
转换为
System.Linq.Expressions.FieldExpression
而不是
System.Linq.Expressions.ConstantExpression
。使用@AleksAndreev解决方案,正确的表达式是常量。有什么想法吗?添加
DateTime now=DateTime.now
now
转换为
System.Linq.Expressions.FieldExpression
而不是
System.Linq.Expressions.ConstantExpression
。使用@AleksAndreev解决方案,正确的表达式是常量。有什么想法吗?