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);
}
Func<object>
と比較するため、これは機能しませんDateTime?
。元のプロパティ式を新しい式にマージしFunc<bool>
、必要なビットを保持して NH QueryOver をそのまま維持するにはどうすればよいですか?
QueryOverRestrictionBuilder の NH ソースを見た後、私はやります
string propertyName = ExpressionProcessor.FindMemberExpression(field.Body)
そして、Criteria メソッドを使用して制限を構築します。