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解决方案,正确的表达式是常量。有什么想法吗?