12

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

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

4

6 回答 6

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 的 Reading 上发表的演讲感兴趣 - 基本上是在一个小时内实现尽可能多的 LINQ to Objects。到最后我们还远未完成,但它应该很好地了解您需要做的事情(以及缓冲/流式传输、迭代器块、查询表达式翻译等)视频还没有发布(我还没有上传代码供下载)但是如果你有兴趣,请给我发邮件至 skeet@pobox.com,我会在视频发布时通知你. (我可能也会写博客。)

于 2008-12-02T07:19:00.337 回答
3

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

于 2008-12-02T07:16:40.547 回答
2

阅读这篇文章:

了解如何创建自定义 LINQ 提供程序

于 2008-12-02T07:17:07.707 回答
2

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

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

一些规则/假设:

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

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

  • 地图 - 用于“选择”
  • 过滤器 - 用于“哪里”
  • flatten - 用于“SelectMany”
  • sort - 多键排序过程
  • groupby - 用于对结构进行分组

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

绑定存储在一个列表中,该列表带有绑定标识符以确保卫生。无论何时出现表达式,绑定都会被提取并在本地反弹。

我确实在我的博客上跟踪了进度,这可能会为可能的问题提供一些见解。

于 2008-12-02T07:39:16.973 回答
2

对于设计理念,请查看催生 Linq 的研究项目c omega 。Linq 是 c omega 的更实用或淡化的版本,具体取决于您的观点。

于 2008-12-02T09:58:44.307 回答
1

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

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

于 2008-12-02T09:15:32.210 回答