我有自定义DateRange类,想简单地为QueryOver添加新的标准,通过创建新的帮助器方法并传递包含我需要的字段和日期范围的lambda。但我无法理解如何转移和转换表达。
public static IQueryOver<tRoot, tSubType> AddDateRangeCritery<tRoot,tSubType>(this IQueryOver<tRoot, tSubType> query,
System.Linq.Expressions.Expression<Func<tSubType, object>> expr, DatesRange range)
{
if (range?.minDate != null)
query.Where(??? >= range.minDate.Value);
}
我尝试编译表达式,但我觉得它不是最好的主意+不能理解如何传递给表达式参数。没有ICriterion可以做到这一点吗?不想这样走,因为我们可以通过财产,而不是字段名称,更稳定的设计。
答案 0 :(得分:0)
如果你改变一点方法的签名就变得非常容易了:
public static IQueryOver<tRoot, tSubType> AddDateRangeCritery<tRoot, tSubType>(
this IQueryOver<tRoot, tSubType> query,
System.Linq.Expressions.Expression<Func<tSubType, DateTime>> expr,
DatesRange range)
{
if (range?.minDate != null)
{
var propr = expr.Body;
var value = Expression.Constant(range.minDate.Value);
var cmp = Expression.GreaterThanOrEqual(propr, value);
var expr2 = Expression.Lambda<Func<tSubType, bool>>(cmp, expr.Parameters);
query.Where(expr2);
}
return query;
}
我已将表达式更改为Func<tSubType, DateTime>
。如果你真的需要它, object
那么它就会变成两三行代码。