我試圖對DateTime進行限制的擴展方法?屬性。這是爲了一個搜索查詢,我真的不希望爲所有可能的日期字段複製此代碼。NH QueryOver擴展:如何將成員表達式合併到另一個表達式中?
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);
}
但是這不會工作,因爲它會是比較Func<object>
到DateTime?
。如何將原始屬性表達式合併爲一個新的Func<bool>
並保留所需的位以保持NH QueryOver的完整性?
看着NH源QueryOverRestrictionBuilder之後,我會做
string propertyName = ExpressionProcessor.FindMemberExpression(field.Body)
,並建立與標準方法的限制。
這使得有很大的意義了。我可以將它重載爲`Expression>`參數。很好的答案。謝謝! –
dotjoe
2011-05-24 20:18:27