在一个包含两个部分的系列文章中,Kevin Halverson 演示了如何通过实现 IQueryable 和 IQueryProvider 接口来创建一个LINQ 提供器。他特别使用了Windows Desktop Search 作为一个数据源。
他以解释CreateQuery 方法的工作原理作为开头。在他的例子当中,Kevin 把一个抽象的语法树转换成了适合Windows Desktop Search 使用的SQL 语句。
抽象语法树是一个表示为对象集合的表达式。其通常作为原始代码到编译代码的中间物,它也能被用在应用程序自我检查的运行时中。
Kevin 介绍的另外一个概念是闭包。闭包,和 lambda 表达式相关的一个概念,贯穿整个 LINQ 查询的设计。
当然,Linq 构架都是围绕着延时执行的概念而展开。也就是说,我在某时创建了一个查询,但是我并没有真正地计算它(获取输入的值并查询背后的数据源),直到我开始使用这个查询的计算结果。由于这个原因,我们打算获取到如何访问 cutoffDate 内容的信息,但不想保存这个值。我可以在查询字符串中放入一个记号([value*]),然后在查询结果可以被访问的时候,创建一个用来得到 cutoffDate 值的函数。
抽象语法树的一个有趣的副作用是你能完全用另外一个函数来代替某个函数的调用。在这个例子中,函数 LikeString 被转换成了 SQL 的 Like 操作符。
在第二部分,Kevin 通过对 GetEnumerator 函数的讨论完成了整个演练。在这里,对其它技术(如:编译一个抽象语法树和解析闭包中的变量)也进行了讨论。
评论