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 > ); 若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即可将这个结构转换为能够被底层数据源所理解的查询语句。

IQueryable在LINQ中的更多相关文章

  1. linq中查询列表的使用及iqueryable和list集合之间的转换

    linq中查询列表的使用及iqueryable和list集合之间的转换 比如要查询一个货架集合,但是只需要其id和name即可,可以用以下方法:先写一个model类:CatalogModel(注意该类 ...

  2. 关于Linq中的Lambda表达式中OrderBy的深入理解

    起因:就是一段Linq语句,OrderBy里面的i是什么? IQueryable<Student> slist = (from s in EFDB.Student select s). O ...

  3. linq中AsEnumerable和AsQueryable的区别

    本文导读:用Linq来操作集合的时候会用到AsQueryable()和AsEnumerable(),何时该用AsQueryable()和何时该用AsEnumerable(),或许存在些疑惑.AsQue ...

  4. 简述Linq中.ToList(), .AsEnumerable(), AsQueryable()的区别和用法

    [TOC] 这3个方法的功能完全不同, 应按照具体业务场景使用. AsQueryable() 先说说什么是 IQueryable IQueryable 是当前的 data provider 返回的类型 ...

  5. Linq中 AsQueryable(), AsEnumerable()和ToList()的区别和用法

    Linq中 AsQueryable(), AsEnumerable()和ToList()的区别和用法:在写LINQ语句的时候,往往会看到AsEnumerable() ,AsQueryable() 和T ...

  6. MVC+Spring.NET+NHibernate .NET SSH框架整合 C# 委托异步 和 async /await 两种实现的异步 如何消除点击按钮时周围出现的白线? Linq中 AsQueryable(), AsEnumerable()和ToList()的区别和用法

    MVC+Spring.NET+NHibernate .NET SSH框架整合   在JAVA中,SSH框架可谓是无人不晓,就和.NET中的MVC框架一样普及.作为一个初学者,可以感受到.NET出了MV ...

  7. LINQ中AsEnumerable与AsQueryable的区别

    AsEnumerable将一个序列向上转换为一个IEnumerable, 强制将Enumerable类下面的查询操作符绑定到后续的子查询当中:AsQueryable将一个序列向下转换为一个IQuery ...

  8. Entity Framework 6 Recipes 2nd Edition(11-9)译 -> 在LINQ中使用规范函数

    11-9. 在LINQ中使用规范函数 问题 想在一个LINQ查询中使用规范函数 解决方案 假设我们已经有一个影片租赁(MovieRental )实体,它保存某个影片什么时候租出及还回来,以及滞纳金等, ...

  9. Entity Framework 6 Recipes 2nd Edition(11-11)译 -> 在LINQ中调用数据库函数

    11-11. 在LINQ中调用数据库函数 问题 相要在一个LINQ 查询中调用数据库函数. 解决方案 假设有一个任命(Appointment )实体模型,如Figure 11-11.所示, 我们想要查 ...

随机推荐

  1. Windows 开启 winrm

    # Windows 开启 winrm   ``` Enable-PSRemoting   winrm enumerate winrm/config/listener   winrm quickconf ...

  2. PAT Basic 1032 挖掘机技术哪家强 (20 分)

    为了用事实说明挖掘机技术到底哪家强,PAT 组织了一场挖掘机技能大赛.现请你根据比赛结果统计出技术最强的那个学校. 输入格式: 输入在第 1 行给出不超过 1 的正整数 N,即参赛人数.随后 N 行, ...

  3. Matrix快速幂 模板

    讲解:http://www.cnblogs.com/SYCstudio/p/7211050.html 给定n*n的矩阵A,求A^k https://www.luogu.org/problem/show ...

  4. Codeforces 907 矩阵编号不相邻构造 团操作状压DFS

    A. #include <bits/stdc++.h> #define PI acos(-1.0) #define mem(a,b) memset((a),b,sizeof(a)) #de ...

  5. [人工智能]IBM Watson人工智能API|一步步创建智能微信翻译官|第一章

    最近参加了IBM可认知内部创业活动,想从零创建一个微信翻译工具,这就是我的AI翻译官.

  6. Word快捷选取

    在word中,你知道鼠标单击选中一个词,双击选中一行,三击选中一个段落吗?

  7. 基于flask的可视化动漫分析网站【python入门必学】

    课程设计项目名称:基于flask的可视化动漫分析网站,如果你在学习Python的过程中,往往因为没有好的教程或者没人指导从而导致自己容易放弃,为此我建了个Python交流.裙 :一久武其而而流一思(数 ...

  8. handy源码阅读(六):tcp类

    首先是tcpconn和tcpserver类: struct TcpConn : public std::enable_shared_from_this<TcpConn>, private ...

  9. linux运维、架构之路-python2.6升级3.6

    一.环境 1.系统 [root@m01 ~]# cat /etc/redhat-release CentOS release 6.9 (Final) [root@m01 ~]# uname -r -. ...

  10. 接口返回buffer的16进制数据如何转换

    我们请求接口数据经常会看到buffer数据,这是我们可以使用data.toString()就可以啦~