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 > ); 若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中的更多相关文章
- linq中查询列表的使用及iqueryable和list集合之间的转换
linq中查询列表的使用及iqueryable和list集合之间的转换 比如要查询一个货架集合,但是只需要其id和name即可,可以用以下方法:先写一个model类:CatalogModel(注意该类 ...
- 关于Linq中的Lambda表达式中OrderBy的深入理解
起因:就是一段Linq语句,OrderBy里面的i是什么? IQueryable<Student> slist = (from s in EFDB.Student select s). O ...
- linq中AsEnumerable和AsQueryable的区别
本文导读:用Linq来操作集合的时候会用到AsQueryable()和AsEnumerable(),何时该用AsQueryable()和何时该用AsEnumerable(),或许存在些疑惑.AsQue ...
- 简述Linq中.ToList(), .AsEnumerable(), AsQueryable()的区别和用法
[TOC] 这3个方法的功能完全不同, 应按照具体业务场景使用. AsQueryable() 先说说什么是 IQueryable IQueryable 是当前的 data provider 返回的类型 ...
- Linq中 AsQueryable(), AsEnumerable()和ToList()的区别和用法
Linq中 AsQueryable(), AsEnumerable()和ToList()的区别和用法:在写LINQ语句的时候,往往会看到AsEnumerable() ,AsQueryable() 和T ...
- 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 ...
- LINQ中AsEnumerable与AsQueryable的区别
AsEnumerable将一个序列向上转换为一个IEnumerable, 强制将Enumerable类下面的查询操作符绑定到后续的子查询当中:AsQueryable将一个序列向下转换为一个IQuery ...
- Entity Framework 6 Recipes 2nd Edition(11-9)译 -> 在LINQ中使用规范函数
11-9. 在LINQ中使用规范函数 问题 想在一个LINQ查询中使用规范函数 解决方案 假设我们已经有一个影片租赁(MovieRental )实体,它保存某个影片什么时候租出及还回来,以及滞纳金等, ...
- Entity Framework 6 Recipes 2nd Edition(11-11)译 -> 在LINQ中调用数据库函数
11-11. 在LINQ中调用数据库函数 问题 相要在一个LINQ 查询中调用数据库函数. 解决方案 假设有一个任命(Appointment )实体模型,如Figure 11-11.所示, 我们想要查 ...
随机推荐
- Linux之bash的变量
1. 变量的显示,echo echo $变量 或 echo ${变量} eg. echo $HOME 或 echo ${HOME} 2. 变量的设置 变量的设置规则: (1)变量与变 ...
- Educational Codeforces Round 55 (Rated for Div. 2) D. Maximum Diameter Graph (构造图)
D. Maximum Diameter Graph time limit per test2 seconds memory limit per test256 megabytes inputstand ...
- 微信公众号接口类(PHP版本)
[项目需求] 通过微信提供的接口,实现微信公众号与后端的应用程序数据交互.消息响应等功能. [项目疑难点] 理解接口工作方式,统一接口API,响应速度.安全性等 [代码举例] WeixinAp ...
- 使用pycharm创建git项目的过程
首先建立远程仓库,然后将远程仓库克隆到本地 然后在pycharm中以该目录创建项目(如果遇到说目录非空,不用管它,Location直接粘贴古来,不然找不到路径) 如果构建好项目说无效的SDK,那么选择 ...
- DevExpress v19.1新版亮点——WinForms篇(三)
行业领先的.NET界面控件DevExpress v19.1终于正式发布,本站将以连载的形式介绍各版本新增内容.在本系列文章中将为大家介绍DevExpress WinForms v19.1中新增的一些控 ...
- [洛谷P4823] TJOI2013 拯救小矮人
问题描述 一群小矮人掉进了一个很深的陷阱里,由于太矮爬不上来,于是他们决定搭一个人梯.即:一个小矮人站在另一小矮人的 肩膀上,知道最顶端的小矮人伸直胳膊可以碰到陷阱口. 对于每一个小矮人,我们知道他从 ...
- layui数据表格排序图标被超出的表头挤出去
如果表头过长,会出现超出显示三个省略号,然后把排序图标挤出去,看不到了, 效果如下 解决办法就是给图标加定位,过长的时候加上 .show-sort{ position: absolute; right ...
- 关于反射和动态代理和AOP
package Exercise.reflect; /** * 反射把java中所有的东西都当做对象,甚至是类的本身也作为一种对象,并把它作为Class的对象的实例: * 反射是把类.类的属性.方法都 ...
- iOS 推送角标解决方案
在App启动时:didFinishLaunchingWithOptions 方法中:application.applicationIconBadgeNumber = ; //角标清零 在读消息时: a ...
- 【bzoj1146】[CTSC2008]网络管理Network
题目描述: M公司是一个非常庞大的跨国公司,在许多国家都设有它的下属分支机构或部门.为了让分布在世界各地的N个部门之间协同工作,公司搭建了一个连接整个公司的通信网络.该网络的结构由N个路由器和N-1条 ...