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. tee 多重定向

    1.命令功能 tee读取标准输入的数据,并将内容输出成文件. 2.语法格式 tee  option  file tee  [-ai]  文件 参数说明 参数 参数说明 -a 追加到文件后面,非覆盖 - ...

  2. 1130. Infix Expression (25)

    Given a syntax tree (binary), you are supposed to output the corresponding infix expression, with pa ...

  3. rocketmq运维管理

    # 运维管理--- ### 1 集群搭建 #### 1.1 单Master模式 这种方式风险较大,一旦Broker重启或者宕机时,会导致整个服务不可用.不建议线上环境使用,可以用于本地测试. #### ...

  4. 【leetcode】622. Design Circular Queue

    题目如下: Design your implementation of the circular queue. The circular queue is a linear data structur ...

  5. Alter改变终结

    #alter#删除date列但若表中只有一个字段无法使用drop删除ALTER TABLE z_staff_info_copy1 DROP `date`;ALTER TABLE z_staff_inf ...

  6. linux文件系统的类型

    文件系统的类型 兄弟连介绍-Linux有四种基本文件系统类型:普通文件.目录文件.连接文件和特殊文件,可用file命令来识别. 普通文件:如文本文件.C语言元代码.SHELL脚本.二进制的可执行文件等 ...

  7. 约数定理(two)

    筛约数个数和 理论基础: 1.对n质因数分解,n=p1^k1 * p2^k2 * p3^k3 …… 则n的约数个数为(k1+1)*(k2+1)*(k3+1)…… 2.线性筛素数时,用i和素数pj来筛掉 ...

  8. 上传文件报413 Request Entity Too Large错误解决办法

    产生这种原因是因为服务器限制了上传大小 1.nginx服务器的解决办法 修改nginx.conf的值就可以解决了 将以下代码粘贴到nginx.conf内 client_max_body_size 20 ...

  9. 用HTML5 Geolocation实现一个距离追踪器

    HTML5 Geolocation(地理定位)用于定位用户的位置.那么如何实现一个距离追踪器呢?我的思路是这样的,前提是浏览器支持h5地理定位,在这个基础上,获取用户位置,更新用户位置,计算距离,显示 ...

  10. linux的find和grep区别?

    为什么会把 grep和find 这两个命令拿在一起来讨论? 是因为他们之间有一个容易混淆的地方, [在我的记忆中] : -name ? 它是find的选项! 不是grep的选项! 实际上, find基 ...