运算符之间的LINQ

下面的IEnumerabletypes正常工作,但有什么办法像这样的工作与IQueryabletypes的SQL数据库?

class Program { static void Main(string[] args) { var items = new[] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, }; foreach (var item in items.Where(i => i.Between(2, 6))) Console.WriteLine(item); } } static class Ext { public static bool Between<T>(this T source, T low, T high) where T : IComparable { return source.CompareTo(low) >= 0 && source.CompareTo(high) <= 0; } } 

如果您将它expression为where子句,那么只要能够构build适当的expression式,就可以使用LINQ to SQL。

在expression树方面可能有更好的方法 – 马克·格雷维尔(Marc Gravell)可能会改进它 – 但值得一试。

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

这可能取决于涉及的types – 特别是,我使用了比较运算符而不是IComparable<T> 。 我怀疑这是更可能被正确地翻译成SQL,但你可以改变它使用CompareTo方法,如果你想。

像这样调用它:

 var query = db.People.Between(person => person.Age, 18, 21);