IQueryable extension method for linq2entities

前端 未结 3 1630
遥遥无期
遥遥无期 2020-12-09 07:17

I am trying to implement an extension method that will work with linq2entities. I had initially assumed that if my extension method took and returned an IQueryable, and as

3条回答
  •  夕颜
    夕颜 (楼主)
    2020-12-09 07:46

    This should work without extending your query provider. It basically breaks it down to exactly what your IsCurrent func is doing.

    public static class IQueryableExtensions
    {
        public static IQueryable IsCurrent(this IQueryable query,
            Expression> expressionEnd,
            Expression> expressionStart,
            DateTime asOf) where T : class
        {
            // Lambdas being sent in
            ParameterExpression paramEnd = expressionEnd.Parameters.Single();
            ParameterExpression paramStart = expressionStart.Parameters.Single();
    
            // GT Comparison
            BinaryExpression expressionGT = ExpressionGT(expressionEnd.Body, asOf);
    
            // LT Comparison
            BinaryExpression expressionLT = ExpressionLE(expressionStart.Body, asOf);
    
            query = query.Where(Expression.Lambda>(expressionGT, paramEnd))
                         .Where(Expression.Lambda>(expressionLT, paramStart));
    
            return query;
        }
    
        private static BinaryExpression ExpressionLE(Expression body, DateTime value)
        {
            return Expression.LessThanOrEqual(body, Expression.Constant(value, typeof(DateTime)));
        }
    
        private static BinaryExpression ExpressionGT(Expression body, DateTime value)
        {
            return Expression.GreaterThan(body, Expression.Constant(value, typeof(DateTime)));
        }
    }
    

    And to use it

    var query = db.PersonHistories.IsCurrent( p => p.Ends, 
                                              p => p.Starts, 
                                              DateTime.Now );
    

提交回复
热议问题