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