我正在尝试为限制 DateTime 制定扩展方法?财产。它用于搜索查询,我真的不想为所有可能的日期字段复制此代码。
public static IQueryOver<T, T> WhereInOpenEndedDateRange<T>(this IQueryOver<T, T> query,
Expression<Func<object>> field,
DateTime? rangeFrom,
DateTime? rangeTo)
{
if(rangeFrom.HasValue && rangeTo.HasValue)
{
query.WhereRestrictionOn(field).IsBetween(rangeFrom.Value).And(rangeTo.Value);
}
else if (rangeFrom.HasValue)
{
//query.Where(() => /* help */ >= rangeFrom.Value);
}
else if (rangeTo.HasValue)
{
//query.Where(() => /* help */ <= rangeTo.Value);
}
return query;
}
我认为我缺少表达的基本方面。是否可以传递某种形式的表达式参数并在现场使用它/* help */
?
谢谢
更新
越来越近了,但还是觉得好远……
else if (rangeFrom.HasValue)
{
var lt = Expression.LessThanOrEqual(field, Expression.Constant(rangeFrom, typeof(DateTime?)));
var b = Expression.Lambda<Func<bool>>(lt);
query.Where(b);
}
但这将不起作用,因为它会Func<object>
与DateTime?
. 如何将原始属性表达式合并为新的Func<bool>
并保留所需的位以保持 NH QueryOver 的完整?
在查看 QueryOverRestrictionBuilder 的 NH 源之后,我会做
string propertyName = ExpressionProcessor.FindMemberExpression(field.Body)
并使用 Criteria 方法构建限制。