代码之家  ›  专栏  ›  技术社区  ›  jool

使用IsInDateTimeRange扩展IQueryable

  •  4
  • jool  · 技术社区  · 7 年前

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

    IQueryable 使用名为 IsInDateTimeRange ,并像这样使用

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

    这对于 IEnumerable Func<T, DateTime> 还有两个 DateTime s、 但是对于 我需要一个 Expression 我真的不知道怎么用这个。

    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));
        }
    
    1 回复  |  直到 7 年前
        1
  •  8
  •   Mike Strobel    7 年前

    可以通过基于传递给方法的属性访问表达式手动构建表达式来实现这一点:

    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);
    }