注意:我的意思是幕后,就像它如何生成代码绑定和所有这些,而不是终端用户的语法.
很难回答这个问题,因为LINQ是很多不同的东西.例如,坚持C#,涉及到以下事项:>查询表达式被“预处理”为“没有查询表达式的C#”,然后正常编译.规范的查询表达式部分真的很短 – 它基本上是一个机械翻译,它不会对查询的真正含义做任何事情,超出了“顺序被翻译成OrderBy / ThenBy / etc”.
>代表用于表示具有特定签名的任意动作,作为可执行代码.
>表达式树用于表示相同的东西,但是作为数据(可以被检查和翻译成不同的形式,例如SQL)
> Lambda表达式用于将源代码转换为委托或表达式树.
>扩展方法被大多数LINQ提供者用于链接静态方法调用.这允许简单的接口(例如IEnumerable T)有效地获得更多的功率.
>匿名类型用于投影 – 您有一些不同的数据集合,并且您希望该数据的每个方面的一部分,匿名类型允许您一起收集.
>隐式类型的局部变量(var)主要用于处理匿名类型时,要保持静态类型语言,您可能无法明确地说出类型的名称.
迭代器块通常用于实现进程中的查询,例如对于LINQ to Objects.
>类型推断用于使整个事情变得更加顺利 – LINQ中有很多通用的方法,没有类型推断,这将是非常痛苦的.
>代码生成用于将模型(例如DBML)转换为代码
>部分类型用于为生成的代码提供可扩展性
>属性用于向LINQ提供者提供元数据
很明显,这些不仅仅是LINQ使用,而是不同的LINQ技术将取决于它们.
如果您能更多地指出您感兴趣的方面,我们可能会提供更多的细节.
如果您有兴趣有效地实现LINQ to Objects,您可能会对几天前阅读的DDD中的一个演讲感兴趣 – 基本上在一小时内尽可能多地实现了LINQ to Object.我们在结束之前还远远没有完成,但它应该对您需要做的事情(以及缓冲/流式传输,迭代器块,查询表达式转换等)给出一个很好的了解.视频还没有(我还没有下载代码),但如果你有兴趣,请给我一封邮件skeet@pobox.com,我会让你知道他们什么时候. (我也可能会博客.)