Nhibernate QueryOver帮助日期范围而不传递字段名称

时间:2017-04-21 10:50:40

标签: c# nhibernate lambda expression queryover

我有自定义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可以做到这一点吗?不想这样走,因为我们可以通过财产,而不是字段名称,更稳定的设计。

1 个答案:

答案 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那么它就会变成两三行代码。