当前位置:
首页 > 网站开发 > ASP.net 4.0教程 >
-
asp.net教程之IQueryProvider和IQueryable<T>接口
IQueryProvider和IQueryable<T>接口
IQueryable和IQueryable<T>同样是LINQ中非常重要的接口,在LINQ查询语句中,IQueryable和IQueryable<T>接口为LINQ查询语句进行解释和翻译工作,开发人员能够通过重写IQueryable和IQueryable<T>接口以实现用不同的方法进行不同的LINQ查询语句的解释。IQueryable<T>继承于IEnumerable<T>和IQueryable接口,在IQueryable中包括两个重要的属性,这两个属性分别为Expression和Provider。Expression和Provider分别表示获取与IQueryable 的实例关联的表达式目录树和获取与数据源关联的查询提供程序,Provider作为其查询的翻译程序实现LINQ查询语句的解释。通过IQueryable和IQueryable<T>接口,开发人员能够自定义LINQ Provider。
注意:Provider可以被看做是一个提供者,用于提供LINQ中某个语句的解释工具,在LINQ中通过编程的方法能够实现自定义Provider。
在IQueryable和IQueryable<T>接口中,还需要另外一个接口,这个接口就是IQueryProvider,该接口用于分解表达式,实现LINQ查询语句的解释工作,这个接口也是整个算法的核心。IQueryable<T>接口在MSDN中的定义如下所示。
public interface IQueryable<T> : IEnumerable<T>, IQueryable, IEnumerable
{
}
public interface IQueryable : IEnumerable
{
Type ElementType { get; } //获取元素类型
Expression Expression { get; } //获取表达式
IQueryProvider Provider { get; } //获取提供者
}
上述代码定义了IQueryable<T>接口的规范,用于保持数据源和查询状态,IQueryProvider在MSDN中定义如下所示。
public interface IQueryProvider
{
IQueryable CreateQuery(Expression expression); //创建可执行对象
IQueryable<TElement> CreateQuery<TElement>(Expression expression); //创建可执行对象
object Execute(Expression expression); //计算表达式
TResult Execute<TResult>(Expression expression); //计算表达式
}
IQueryProvider用于LINQ查询语句的核心算法的实现,包括分解表达式和表达式计算等。为了能够创建自定义LINQ Provider,可以编写接口的实现。示例代码如下所示。
public IQueryable<TElement> CreateQuery<TElement>(Expression expression)
{
query.expression = expression; //声明表达式
return (IQueryable<TElement>)query; //返回query对象
}
上述代码用于构造一个可用来执行表达式计算的IQueryable 对象,在接口中可以看到需要实现两个相同的执行表达式的IQueryable 对象,另一个则是执行表达式对象的集合,其实现代码如下所示。
public IQueryable CreateQuery(Expression expression)
{
return CreateQuery<T>(expression); //返回表达式的集合
}
而作为表达式解释和翻译的核心接口,则需要通过算法实现相应Execute方法,示例代码如下所示。
public TResult Execute<TResult>(Expression expression)
{
var exp = expression as MethodCallExpression; //创建表达式对象
var data = ((exp.Arguments[0] as ConstantExpression).Value as MyQuery<T>).Data;
var func = (exp.Arguments[1] as UnaryExpression).Operand as Expression
<System.Func<T, bool>>;
var lambda = Expression.Lambda<Func<T, bool>>(func.Body, func.Parameters[0]);
var r = data.Where(lambda.Compile()); //编译表达式
return (TResult)r.GetEnumerator();
}
上述代码通过使用lambda表达式进行表达式的计算,实现了LINQ中查询的解释功能。在LINQ中,对于表达式的翻译和执行过程都是通过IQueryProvider和IQueryable<T>接口来实现的。IQueryProvider和IQueryable<T>实现用户表达式的翻译和解释,在LINQ应用程序中,通常无需通过IQueryProvider和IQueryable<T>实现自定义LINQ Provider,因为LINQ已经提供强大表达式查询和计算功能。了解IQueryProvider和IQueryable<T>接口有助于了解LINQ内部是如何执行的。
栏目列表
最新更新
nodejs爬虫
Python正则表达式完全指南
爬取豆瓣Top250图书数据
shp 地图文件批量添加字段
爬虫小试牛刀(爬取学校通知公告)
【python基础】函数-初识函数
【python基础】函数-返回值
HTTP请求:requests模块基础使用必知必会
Python初学者友好丨详解参数传递类型
如何有效管理爬虫流量?
SQL SERVER中递归
2个场景实例讲解GaussDB(DWS)基表统计信息估
常用的 SQL Server 关键字及其含义
动手分析SQL Server中的事务中使用的锁
openGauss内核分析:SQL by pass & 经典执行
一招教你如何高效批量导入与更新数据
天天写SQL,这些神奇的特性你知道吗?
openGauss内核分析:执行计划生成
[IM002]Navicat ODBC驱动器管理器 未发现数据
初入Sql Server 之 存储过程的简单使用
这是目前我见过最好的跨域解决方案!
减少回流与重绘
减少回流与重绘
如何使用KrpanoToolJS在浏览器切图
performance.now() 与 Date.now() 对比
一款纯 JS 实现的轻量化图片编辑器
关于开发 VS Code 插件遇到的 workbench.scm.
前端设计模式——观察者模式
前端设计模式——中介者模式
创建型-原型模式