运算符之间的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);
- 如何添加一个索引字段Linq结果
- PHP中有什么相当于C#中的LINQ?
- Linq-to-SQL ToDictionary()
- LINQselect不同于匿名types
- 将Linqexpression式“obj => obj.Prop”转换为“parent => parent.obj.Prop”
- Linq。所有VS.Exists – 有什么区别?
- 不能将types'System.Collections.Generic.IEnumerable <AnonymousType#1>'隐式转换为'System.Collections.Generic.List <string>
- 如何在Mono中使用LINQ?
- 如何编写一个导致字典的LINQ查询?