Linq如何工作(在幕后)?

时间:2008-12-02 07:08:41

标签: linq lua

我正在考虑为Lua制作Linq这样的东西,我对Linq的工作原理有一个大概的了解,但我想知道是否有一篇好文章或是否有人可以解释C#如何使Linq成为可能

注意:我的意思是在幕后,比如它如何生成代码绑定以及所有这些,而不是最终用户语法。

6 个答案:

答案 0 :(得分:18)

很难回答这个问题,因为LINQ有很多不同的东西。例如,坚持使用C#,涉及以下内容:

  • 查询表达式被“预处理”为“没有查询表达式的C#”,然后正常编译。规范的查询表达式部分非常简短 - 它基本上是一个机械翻译,它不会假设查询的真正含义,除了“order by被翻译成OrderBy / ThenBy / etc”。
  • 代理用于表示具有特定签名的任意操作,作为可执行代码。
  • 表达式树用于表示相同的事物,但用作数据(可以检查并翻译成不同的形式,例如SQL)
  • Lambda表达式用于将源代码转换为委托或表达式树。
  • 大多数LINQ提供程序使用扩展方法将静态方法调用链接在一起。这允许简单的界面(例如IEnumerable<T>)有效地获得更多的权力。
  • 匿名类型用于投影 - 您有一些不同的数据集合,并且您需要该数据的每个方面的位,匿名类型允许您将它们聚集在一起。
  • 隐式类型的局部变量(var)主要用于处理匿名类型,以维护静态类型语言,您可能无法明确地“说出”该类型的名称。
  • 迭代器块通常用于实现进程内查询,例如,用于LINQ to Objects。
  • 类型推断用于使整个事情更顺畅 - 在LINQ中有很多泛型方法,没有类型推断它会非常痛苦。
  • 代码生成用于将模型(例如DBML)转换为代码
  • 部分类型用于为生成的代码提供可扩展性
  • 属性用于向LINQ提供程序提供元数据

显然,其中很多都不是使用LINQ,但不同的LINQ技术将依赖于它们。

如果您可以更多地说明您感兴趣的方面,我们可能会提供更多详细信息。

如果你对有效实现LINQ to Objects感兴趣,你可能会对我几周前在DDD中给DDD的讲话感兴趣 - 基本上在一小时内尽可能多地实现LINQ to Objects。我们在结束时还远未完成,但它应该很好地理解你需要做的事情的(以及缓冲/流,迭代器块,查询表达式转换等)。视频还没有播放(我还没有下载代码)但如果你有兴趣,请发邮件至skeet@pobox.com,我会告诉你他们什么时候起来。 (我可能也会写博客。)

答案 1 :(得分:3)

Mono(部分?)实现了LINQ,并且是开源的。也许你可以调查他们的实现?

答案 2 :(得分:2)

答案 3 :(得分:2)

也许我的LINQ for R6RS Scheme会提供一些见解。

它在语义上是100%,并且几乎100%在语法上与LINQ相同,除了使用'then'而不是','的其他排序参数之外。

一些规则/假设:

  • 只处理列表,没有查询提供程序。
  • 不是懒惰,而是渴望理解。
  • 没有静态类型,因为Scheme不使用它们。

我的实施取决于几个核心程序:

  • 地图 - 用于“选择”
  • 过滤器 - 用于'Where'
  • flatten - 用于'SelectMany'
  • sort - 多键排序程序
  • groupby - 用于分组构造

结构的其余部分都是使用宏构建的。

绑定存储在标有绑定标识符的列表中,以确保卫生。在任何表达发生的地方提取和反弹绑定。

我确实跟踪了blog上的进度,这可能会对可能出现的问题提供一些见解。

答案 4 :(得分:2)

有关设计理念,请查看生成Linq的研究项目c omega。根据你的观点,Linq是一个更实用或更淡化的c omega版本。

答案 5 :(得分:1)

Matt Warren的博客提供了所有答案(以及一个示例IQueryable提供程序实现,为您提供了一个先机):

http://blogs.msdn.com/mattwar/