Ну, я не мог понять, как это сделать, используя
Expression<Func<bool>>
подпись, но в любом случае это только для DateTime? S, поэтому я не вижу, как добавит ограничение, которое я добавиллюбая разница.
По сути, вам нужно выражение (поле в вашем примере), чтобы точно соответствовать параметру, который вы отправляете, то есть x => x.SomeNullableDateField.'x' - это тип запроса, который вы начали с
session.QueryOver<YourClass>()
, поэтому его необходимо было включить в тип отправляемого выражения. Вы также пропустили получение этого параметра, используя
ParameterExpression param = expression.Parameters.Single()
, который будет использоваться для построения выражений сравнения.
Вы должны были преобразовать BinaryExpression в Expression<Func<bool>>
, но вам пришлось сделать еще один шаг вперед к Expression<Func<T, bool>>
.
public static IQueryOver<T, T> WhereInOpenEndedDateRange<T>(this IQueryOver<T, T> query,
Expression<Func<T, DateTime?>> expression,
DateTime? rangeFrom,
DateTime? rangeTo) where T : class
{
// Lambda being sent in
ParameterExpression param = expression.Parameters.Single();
if(rangeFrom.HasValue && rangeTo.HasValue)
{
// GT Comparison
var expressionGT =
Expression.GreaterThanOrEqual(
expression.Body,
Expression.Constant(rangeFrom.Value, typeof(DateTime?)
)
);
// LT Comparison
var expressionLT =
Expression.LessThanOrEqual(
expression.Body,
Expression.Constant(rangeTo.Value, typeof(DateTime?)
)
);
query.Where(
Expression.Lambda<Func<T, bool>>(expressionGT, param))
.And(
Expression.Lambda<Func<T, bool>>(expressionLT, param)
);
}
else if(rangeFrom.HasValue)
{
// GT Comparison
BinaryExpression expressionGT =
Expression.GreaterThanOrEqual(
expression.Body,
Expression.Constant(rangeFrom.Value, typeof(DateTime?)
)
);
// covert to lambda
query.Where(Expression.Lambda<Func<T, bool>>(expressionGT, param));
}
else if(rangeTo.HasValue)
{
// LT Comparison
BinaryExpression expressionLT =
Expression.LessThanOrEqual(
expression.Body,
Expression.Constant(rangeTo.Value, typeof(DateTime?)
)
);
query.Where(Expression.Lambda<Func<T, bool>>(expressionLT, param));
}
return query;
}
Использование
var test = session.QueryOver<MyPocoClass>()
.WhereInOpenEndedDateRange(x=>x.SomeNullableDateField, DateTime.Now, null);