编写一个可以只使用我的类定义(没有任何对象引用作为属性)并给我翻译后的 SQL 的愚蠢 LINQ 提供程序是多么容易。它可以假设属性和列的名称以及类和基础表的名称相同。你能给我一些指点吗?
5 回答
我花了大约 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 提供程序的工具包。
我根据从头开始开发 LINQ-to-SQL 提供程序的经验,在我的博客上编写了一个教程系列,从表达式树组合阶段(调用 LINQ 方法)开始,继续表达式访问者,分解查询到组件中,解析 where 子句,生成文本和参数,最后,使用 .NET 表达式命名空间将整个内容编译到 IL 中。
我见过许多承诺解释如何编写提供程序的不完整的帖子,但没有达到标准,几乎没有触及表面,实际上并没有提供任何远程可执行的东西。
我根据自己的经验编写的博客系列有一个示例项目可供下载,该简单提供程序仅涵盖教程示例所需的功能。但是,它还包括支持许多操作(where、join、first、count、top 等)、子查询、嵌套语句等的生产版本。此外,它产生的 SQL 比我的很多已经从实体和 LINQ-to-SQL 中看到。没有不必要的/冗余的嵌套,将所有内容都包含在括号中等等。
对于任何具有良好抽象思维水平的人来说,开发这样的提供程序并不是许多人认为的那么困难的任务。我在大约 3 个月的兼职工作(意味着一些晚上和周末)中开发了一个用于生产环境的产品。从一开始,它就以性能和整洁的 SQL 为目标——这是它实现的目标。
很难找到时间发布这些材料,但我想——如果它可以帮助到那里的人,那么没有理由浪费这种经验:
我创建了一个项目“ LinqToAnything ”,旨在使实现(简单)Linq 提供程序变得非常容易。