IQueryable Extension Using IsInDateTimeRange

So I'm a little tired of rewriting the same queries over and over again.

repo.Query().Where(stuff => stuff.Timestamp >= minTime && stuff.Timestamp <= maxTime && ...);

I thought I should expand IQueryableusing the method IsInDateTimeRangeand use it like this:

repo.Query().IsInDateTimeRange(stuff => stuff.Timestamp, minTime, maxTime) ...

it would be very easy for IEnumerable, just Func<T, DateTime>and two DateTimes, however for IQueryableme I need to take Expression, and I'm not sure how to use it.

It was my attempt, but does not seem to work.

public static IQueryable<TValue> IsInDateTimeRange<TValue>(
        this IQueryable<TValue> self,
        Expression<Func<TValue, DateTime>> getMember,
        DateTime minTime,
        DateTime maxTime)
    {
        return self.Where(value => minTime >= getMember(value) && maxTime <= getMember(value));
    }
+4
source share
1 answer

This can be done manually by creating an expression based on a property access expression that is passed to the method:

public static IQueryable<TValue> IsInDateTimeRange<TValue>(
    this IQueryable<TValue> self,
    Expression<Func<TValue, DateTime>> getMember,
    DateTime minTime,
    DateTime maxTime)
{
    var getMemberBody = getMember.Body;
    var filter = Expression.Lambda<Func<TValue, bool>>(
        Expression.And(
            Expression.LessThanOrEqual(
                Expression.Constant(minTime),
                getMemberBody
            ),
            Expression.LessThanOrEqual(
                getMemberBody,
                Expression.Constant(maxTime)
            )
        ),
        getMember.Parameters
    );
    return self.Where(filter);
}
+7

Source: https://habr.com/ru/post/1685137/


All Articles