【问题标题】:LINQ Between Operator运算符之间的 LINQ
【发布时间】:2009-09-19 03:27:03
【问题描述】:

以下内容适用于 IEnumerable 类型,但是有什么方法可以让这样的东西对 sql 数据库使用 IQueryable 类型?

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

【问题讨论】:

    标签: linq linq-to-sql


    【解决方案1】:

    如果您将其表达为where 子句,它可能可以直接使用 LINQ to SQL,前提是您可以构造适当的表达式。

    在表达式树方面可能有更好的方法 - 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);
       }
    }
    

    这可能取决于所涉及的类型 - 特别是,我使用了比较运算符而不是 IComparable&lt;T&gt;。我怀疑这更有可能被正确翻译成 SQL,但如果需要,您可以将其更改为使用 CompareTo 方法。

    像这样调用它:

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

    【讨论】:

    • 不错。这也让我对 Linq 表达式的理解多了一点。
    • 乔恩,对不起,我没有接受这个。这几天天气不好。问题:您写的是使用比较运算符而不是 IComparable。那会是什么样子? IEnumerable 中的任何一个看起来像什么?我需要玩这个,希望今天能做到。非常感谢!
    • 使用 IComparable&lt;T&gt; 你需要表达式树来调用 CompareTo 两次。都可以,就是有点痛。不知道您所说的“IEnumerable&lt;T&gt; 会是什么样子?” - 你能详细说明吗?
    • 我也认为这是一个很好的代码示例,使用 var 关键字将更具可读性。
    • 这很酷。我可以建议一个可选的inclusive 参数吗?
    猜你喜欢
    • 2011-05-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多