【发布时间】:2016-07-21 15:08:14
【问题描述】:
我有一个 DateRange 类,我想将它作为 where 谓词应用于 IQueryable,自动使用开始日期和结束日期,并自动使用开放或封闭间隔。
public class DateRange
{
public DateTime? BeginDate { get; set; }
public DateTime? EndDate { get; set; }
public bool BeginInclusive { get; set; }
public bool EndInclusive { get; set; }
public DateRange()
{
BeginInclusive = true;
EndInclusive = false;
}
public IQueryable<T> Apply<T>( IQueryable<T> source, Expression<Func<T,DateTime>> dateField )
{
var result = source;
if (BeginDate.HasValue)
{
if (BeginInclusive)
result = result.Where( x => dateField >= BeginDate ); //does not compile
else
result = result.Where( x => dateField > BeginDate ); //does not compile
}
if (EndDate.HasValue)
{
if (EndInclusive)
result = result.Where( x => dateField <= EndDate ); //does not compile
else
result = result.Where( x => dateField < EndDate ); //does not compile
}
return result;
}
}
我想这样称呼它,DateField 是 T 的任何 DateTime 属性。
DateRange d;
IQueryable<T> q;
q = d.Apply( q, x => x.DateField );
所以我想将成员表达式传递给 Apply 方法,并让它将适当的 where 子句应用于结果集,但我不知道如何获取嵌入在 where 中的 dateField 成员表达式em> 谓词的表达式。请参阅上面类中的“不编译”行。我需要以某种方式转换 dateField 或以其他方式构建谓词表达式,但我不知道该怎么做。
【问题讨论】:
-
您必须使用
Expression类方法手工制作dateField >= BeginDate。 -
我不知道该怎么做。我不太使用 Expression 类本身。我使用过 LinqKit 的 PredicateBuilder,但在这种情况下并没有多大帮助。最后的 'where' 谓词也必须在 Linq-to-Entities 中起作用。
-
这个样子怎么样:
var expr = Expression.GreaterThanOrEqual( dateField.Body, Expression.Constant( BeginDate ) ); result = result.Where( Expression.Lambda<Func<T, bool>>( expr ) ); -
我很确定您需要将参数传递给
Expression.Lambda。当我尝试时,您的代码会引发异常。看看我的回答。
标签: c# lambda expression