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.所示, 我们想要查 ...
随机推荐
- Educational Codeforces Round 68 (Rated for Div. 2) C. From S To T (字符串处理)
C. From S To T time limit per test1 second memory limit per test256 megabytes inputstandard input ou ...
- IDEA更改左侧目录层级结构
齿轮---Compact Empty Middle Packages
- ZROI 19.07.28 序列数据结构/jk
写在前面 dls:"我不会数据结构,但是APIO的数据结构场我写了,还是蛮简单的." T1 CF643G Sol: 有一个\(O(n\log^2n)\)的做法:假设将区间排好序,取 ...
- JVM内存结构之本地方法栈
Native Method Stacks(本地方法栈) 本地方法:指不是用Java语言编写的方法,因为Java语言是有一定限制的,有些情况下它是不能直接和操作系统打交道的.这时就需要调用一些用C或C+ ...
- 【LuoguP3241】[HNOI2015] 开店
题目链接 题意 给出一棵边带权的树,多次在线询问一个点到一个区间内的点的距离和. Sol 分块过不了的 一个 trick ,都知道要算两点之间距离可以拆成到根的距离和他们的 LCA 到根的距离 ,其实 ...
- MAN RPM
RPM(8) Red Hat Linux RPM(8) NAME/名称 rpm - RPM Package Manager/RPM-RPM包管理器SYNOPSIS/简介 QUER ...
- 3分钟教会你把封装的js公共方法挂载在vue实例原型上
第一步:首先在src文件夹里面创建一个通用js文件夹,然后在创建的文件夹里面创建一个js文件 第二步:const 一个方法,然后通过export暴露出来(在同一个页面可以写多个方法,和暴露多个方法,在 ...
- 在 Postman 中报错:Self-signed SSL certificates are being blocked 的分析与解决
http://www.shuijingwanwq.com/2019/02/18/3171/
- Internet History, Technology, and Security(week9)——Web Security
Secure Web Connections: Security Public/Private Key - Secure Sockets 凯撒密码容易被破解,后来人们发明了公钥和私钥,由于私钥一定是要 ...
- 【转】SQL Pretty Printer for SSMS 很不错的SQL格式化插件
源地址:https://www.cnblogs.com/leospace/archive/2012/09/04/SQL_Pretty_Printer_for_SSMS.html 写SQL语句或者脚本时 ...