【发布时间】:2009-04-03 14:32:29
【问题描述】:
编写一个可以只使用我的类定义(没有任何对象引用作为属性)并给我翻译后的 SQL 的愚蠢 LINQ 提供程序是多么容易。它可以假定属性和列的名称以及类和基础表的名称相同。能不能指点一下?
【问题讨论】:
编写一个可以只使用我的类定义(没有任何对象引用作为属性)并给我翻译后的 SQL 的愚蠢 LINQ 提供程序是多么容易。它可以假定属性和列的名称以及类和基础表的名称相同。能不能指点一下?
【问题讨论】:
我花了大约 4 个月的全职工作(每天 8 小时)来构建一个稳定的、可运行的提供程序,它实现了 linq 的整个规范。我会说大约三周后我有一个非常简单、错误和不稳定的版本,所以如果你只是在寻找一些粗糙的东西,我会说你可能会看一周到两个月的任何东西,这取决于你有多好是什么类型的requiements 你有。
为此,我必须将您指向 Wayward 博客,Matt 写了一篇关于如何实现 linq 提供程序的非常好的演练,即使您可能无法复制和粘贴,它也会对您有所帮助掌握工作时的思维方式。你可以在这里找到马特的演练:http://blogs.msdn.com/mattwar/archive/2007/07/30/linq-building-an-iqueryable-provider-part-i.aspx。我建议您按照 Matt 的方式进行操作,并扩展 Matt 在其教程的第二部分中包含的表达式树访问者。
另外,当我开始使用这个时,我从表达式树可视化器中得到了很多帮助,一旦你看到 linq 如何解析查询,它确实让解析变得容易多了。
构建提供程序确实很有趣,即使有时有点令人沮丧。祝你一切顺利!
【讨论】:
看看LINQExtender 项目,它是一个用于创建自定义 LINQ 提供程序的工具包。
【讨论】:
另一个帮助你的选择似乎是re-linq,它是一个用于创建自定义 LINQ 提供程序的框架。
这里是 Source code 和一个很好的 overview (pdf) 写一个所涉及的内容。
【讨论】:
根据我从头开始开发 LINQ-to-SQL 提供程序的经验,我在我的博客上写了一个教程系列,从表达式树组合阶段(调用 LINQ 方法)开始,继续表达式访问者,分解将查询转换为组件,解析 where 子句,生成文本和参数,最终使用 .NET 表达式命名空间将整个内容编译到 IL 中。
我看到许多不完整的帖子承诺解释如何编写提供程序,但没有达到标准,几乎没有触及表面,实际上并没有提供任何远程可执行的东西。
我根据自己的经验编写的博客系列有一个示例项目可供下载,该简单提供程序仅涵盖教程示例所需的功能。但是,它还包括支持许多操作(where、join、first、count、top 等)、子查询、嵌套语句等的生产版本。此外,它产生的 SQL 比我的很多已经从实体和 LINQ-to-SQL 中看到。没有不必要/冗余的嵌套,将所有内容都包裹在括号中等等。
对于任何具有良好抽象思维水平的人来说,开发这样的提供程序并不是许多人认为的那么困难的任务。我在大约 3 个月的兼职工作(意味着一些晚上和周末)中开发了一个用于生产环境的产品。从一开始,它就以性能和整洁的 SQL 为目标——这是它实现的目标。
很难找到时间发布这些材料,但我想——如果它可以帮助到那里的人,那么没有理由浪费这种经验:
【讨论】:
我创建了一个项目“LinqToAnything”,旨在使实现(简单)Linq 提供程序变得非常容易。
【讨论】: