日期范围的 Nhibernate QueryOver 帮助程序不传递字段名称
Nhibernate QueryOver helper for date range without passing field name
我有自定义 DateRange class 并希望通过创建新的辅助方法并传递包含我需要的字段和日期范围的 lambda 来简化为 QueryOver 添加新条件。但是我不明白如何传递和转换表达式。
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是否可以做到这一点?不想走这条路,因为我们可以传递 属性 而不是字段名称,这样设计更稳定。
如果稍微更改方法的签名,它会变得非常简单:
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
那么它会变成两三行代码。
我有自定义 DateRange class 并希望通过创建新的辅助方法并传递包含我需要的字段和日期范围的 lambda 来简化为 QueryOver 添加新条件。但是我不明白如何传递和转换表达式。
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是否可以做到这一点?不想走这条路,因为我们可以传递 属性 而不是字段名称,这样设计更稳定。
如果稍微更改方法的签名,它会变得非常简单:
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
那么它会变成两三行代码。