NH QueryOver扩展:如何将成员表达式合并到另一个表达式中?
|
我正在尝试为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;
}
我认为我缺少表达的基本方面。是否可以通过某种形式的Expression参数并将其用于/* 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);
}
但这不起作用,因为它会将comparing3ѭ与DateTime?
进行比较。如何将原始属性表达式合并为新的ѭ5,并保留所需的位以使NH QueryOver保持原样?
在查看QueryOverRestrictionBuilder的NH源之后,我将做
string propertyName = ExpressionProcessor.FindMemberExpression(field.Body)
并建立“使用条件限制”方法。
没有找到相关结果
已邀请:
1 个回复
苛肠倒俱
签名,但无论如何这仅适用于DateTime,因此我看不到添加的限制有什么不同。 基本上,您需要表达式(示例中的字段)完全匹配您要发送的参数,即x => x.SomeNullableDateField。 \'x \'是您开始使用的查询类型
因此它需要包含在发送的表达式类型中。您还错过了使用
用于构造比较表达式。 您本打算将BinaryExpression转换为
,但必须将其进一步提高到
。
用法