If you express it as a where clause, it can just work out of the box with LINQ to SQL if you can build the appropriate expression.
Perhaps the best way to do this in terms of expression trees is that Mark Gravell may well improve it, but it's worth a try.
static class Ext { public static IQueryable<TSource> Between<TSource, TKey> (this IQueryable<TSource> source, Expression<Func<TSource, TKey>> keySelector, TKey low, TKey high) where TKey : IComparable<TKey> { Expression key = Expression.Invoke(keySelector, keySelector.Parameters.ToArray()); Expression lowerBound = Expression.GreaterThanOrEqual (key, Expression.Constant(low)); Expression upperBound = Expression.LessThanOrEqual (key, Expression.Constant(high)); Expression and = Expression.AndAlso(lowerBound, upperBound); Expression<Func<TSource, bool>> lambda = Expression.Lambda<Func<TSource, bool>>(and, keySelector.Parameters); return source.Where(lambda); } }
This will probably depend on what type is involved, in particular, I used comparison operators, not IComparable<T> . I suspect that this will most likely be correctly translated into SQL, but you can change it to use the CompareTo method if you want.
Call it like this:
var query = db.People.Between(person => person.Age, 18, 21);
Jon Skeet Sep 19 '09 at 6:07 2009-09-19 06:07
source share