IQueryable在LINQ中

IQueryable接口定义如下: 

    // 摘要:
    //     提供对未指定数据类型的特定数据源的查询进行计算的功能。
    public interface IQueryable : IEnumerable
    {
        // 摘要:
        //     获取在执行与 System.Linq.IQueryable 的此实例关联的表达式目录树时返回的元素的类型。
        //
        // 返回结果:
        //     一个 System.Type,表示在执行与之关联的表达式目录树时返回的元素的类型。
        Type ElementType { get; }
        //
        // 摘要:
        //     获取与 System.Linq.IQueryable 的实例关联的表达式目录树。
        //
        // 返回结果:
        //     与 System.Linq.IQueryable 的此实例关联的 System.Linq.Expressions.Expression。
        Expression Expression { get; }
        //
        // 摘要:
        //     获取与此数据源关联的查询提供程序。
        //
        // 返回结果:
        //     与此数据源关联的 System.Linq.IQueryProvider。
        IQueryProvider Provider { get; }
    }

IQueryProvider接口定义如下:

    // 摘要:
    //     定义用于创建和执行 System.Linq.IQueryable 对象所描述的查询的方法。
    public interface IQueryProvider
    {
        // 摘要:
        //     构造一个 System.Linq.IQueryable 对象,该对象可计算指定表达式目录树所表示的查询。
        //
        // 参数:
        //   expression:
        //     表示 LINQ 查询的表达式目录树。
        //
        // 返回结果:
        //     一个 System.Linq.IQueryable,它可计算指定表达式目录树所表示的查询。
        IQueryable CreateQuery(Expression expression);
        //
        // 摘要:
        //     构造一个 System.Linq.IQueryable<T> 对象,该对象可计算指定表达式目录树所表示的查询。
        //
        // 参数:
        //   expression:
        //     表示 LINQ 查询的表达式目录树。
        //
        // 类型参数:
        //   TElement:
        //     返回的 System.Linq.IQueryable<T> 的元素的类型。
        //
        // 返回结果:
        //     一个 System.Linq.IQueryable<T>,它可计算指定表达式目录树所表示的查询。
        IQueryable<TElement> CreateQuery<TElement>(Expression expression);
        //
        // 摘要:
        //     执行指定表达式目录树所表示的查询。
        //
        // 参数:
        //   expression:
        //     表示 LINQ 查询的表达式目录树。
        //
        // 返回结果:
        //     执行指定查询所生成的值。
        object Execute(Expression expression);
        //
        // 摘要:
        //     执行指定表达式目录树所表示的强类型查询。
        //
        // 参数:
        //   expression:
        //     表示 LINQ 查询的表达式目录树。
        //
        // 类型参数:
        //   TResult:
        //     执行查询所生成的值的类型。
        //
        // 返回结果:
        //     执行指定查询所生成的值。
        TResult Execute<TResult>(Expression expression);
    }


通过这种接口设计,IQueryable允许开发人员创建支持其他非SQL Server数据库的实现。

Provider将借助于IQueryable所提供的种种信息把查询语句转换为另一种形式,转换的实际操作将由CreateQuery方法实现,随后转换的结果将由Execute方法使用。

为了理解IQueryable,我们看如下查询:

IEnumerable<Book> query = DataContext.Books.Where(book => book.Price > 30); 

若DataContext.Books对象仅实现了IEnumerable<T>,那么编译器会把该查询直接翻译成一系列标准的静态方法调用:

                IEnumerable<Book> query =
                    System.Linq.Enumerable.Where<Book>(
                    delegate(Book book) { return book.Price > 30.0M; });

若是DataContext.Books对象还实现了IQueryable<T>,那么编译器将把查询转换成一棵表达式树:

                LinqBooksDataContext context = new LinqBooksDataContext(); 

                var bookParam = Expression.Parameter(typeof(Book), "book");

                var query = context.Books.Where<Book>(Expression.Lambda<Func<Book, bool>>(
                    Expression.GreaterThan(
                    Expression.Property(
                    bookParam,
                    typeof(Book).GetProperty("Price")),
                    Expression.Constant(30M, typeof(decimal?))),
                    new ParameterExpression[] { bookParam })); 

IQueryable的Provider即可将这个结构转换为能够被底层数据源所理解的查询语句。

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值