C# 如何构建表达式<;Func<;T、 布尔>;来自另一个表达式(表达式<;Func<;T,日期时间>;)
我想为Where子句构建一个表达式C# 如何构建表达式<;Func<;T、 布尔>;来自另一个表达式(表达式<;Func<;T,日期时间>;),c#,linq,C#,Linq,我想为Where子句构建一个表达式 Expression<Func<T, bool>> 表达式 在接受类型为的参数的方法上 Expression<Func<T, DateTime>> 表达式 我想操纵DateTime属性来比较其内部属性,比如在day、month和year属性中添加compare子句 我的方法如下: public static class MyUtils { public static Expression<F
Expression<Func<T, bool>>
表达式
在接受类型为的参数的方法上
Expression<Func<T, DateTime>>
表达式
我想操纵DateTime属性来比较其内部属性,比如在day、month和year属性中添加compare子句
我的方法如下:
public static class MyUtils
{
public static Expression<Func<T, bool>> GetTime<T>(this Expression<Func<T, bool>> pExp, Expression<Func<T, DateTime>> MyProperty, int day, int month, int year)
{
}
}
公共静态类MyUtils
{
公共静态表达式GetTime(此表达式pExp、表达式MyProperty、整数天、整数月、整数年)
{
}
}
我想这样使用它:
Expression<Func<MyClass, bool>> vExpression = p => false;
vExpression = vExpression.GetTime<MyClass>(c => c.MyDate, 21, 12, 2012);
static Expression<Func<T, bool>> GetTime<T>(
Expression<Func<T, DateTime>> expression,
DateTime compare
)
{
var comparison = Expression.Equal(expression.Body, Expression.Constant(compare));
return Expression.Lambda<Func<T, bool>>(comparison, expression.Parameters);
}
表达式vExpression=p=>false;
vExpression=vExpression.GetTime(c=>c.MyDate,2012年12月21日);
因此,在方法的末尾,我对“MyDate”属性和各个日期值进行了一些比较
可以这样做吗?或许可以这样做:
Expression<Func<MyClass, bool>> vExpression = p => false;
vExpression = vExpression.GetTime<MyClass>(c => c.MyDate, 21, 12, 2012);
static Expression<Func<T, bool>> GetTime<T>(
Expression<Func<T, DateTime>> expression,
DateTime compare
)
{
var comparison = Expression.Equal(expression.Body, Expression.Constant(compare));
return Expression.Lambda<Func<T, bool>>(comparison, expression.Parameters);
}
静态表达式GetTime(
表情表情,
日期时间比较
)
{
变量比较=表达式.Equal(表达式.Body,表达式.Constant(比较));
返回表达式.Lambda(比较,表达式.参数);
}
然后,您可以执行以下操作:
Expression<Func<MyClass, bool>> vExpression = GetTime<MyClass>(
c => c.MyDate,
new DateTime(2012, 12, 21)
);
表达式vExpression=GetTime(
c=>c.MyDate,
新日期时间(2012年12月21日)
);
编辑
上面的代码显示了如何基于旧的表达式树创建新的表达式树。可以使用任何允许的构造创建新的表达式树。下面是一个稍微复杂一点的例子:
static Expression<Func<T, bool>> GetTime<T>(
Expression<Func<T, DateTime>> expression,
DateTime compare
)
{
var comparison = Expression.AndAlso(
Expression.AndAlso(
Expression.GreaterThanOrEqual(
Expression.Property(expression.Body, "Year"),
Expression.Constant(compare.Year)
),
Expression.GreaterThanOrEqual(
Expression.Property(expression.Body, "Month"),
Expression.Constant(compare.Month)
)
),
Expression.GreaterThanOrEqual(
Expression.Property(expression.Body, "Day"),
Expression.Constant(compare.Day)
)
);
return Expression.Lambda<Func<T, bool>>(comparison, expression.Parameters);
}
静态表达式GetTime(
表情表情,
日期时间比较
)
{
var比较=表达式.AndAlso(
安达尔索(
表达式。大于或等于(
Expression.Property(Expression.Body,“年”),
表达式.常量(比较.年)
),
表达式。大于或等于(
Expression.Property(Expression.Body,“月”),
表达式.Constant(比较.Month)
)
),
表达式。大于或等于(
Expression.Property(Expression.Body,“日”),
表达式.常量(比较.Day)
)
);
返回表达式.Lambda(比较,表达式.参数);
}
对我来说似乎没问题,这是你的问题吗?我想使用日、月和年属性。或者我不够清楚,我想操纵“日”、“月”和“年”属性彼此独立,因为我将使用它们在范围之间进行筛选,例如:dateProperty.Year>=2011&&dateProperty.Year>=2012&&dateProperty.Month>=5&&dateProperty.Month>=8&&dateProperty.Day>=15&&dateProperty.Year>=25Thank@Bojan,这就是我要找的。