我喜欢在.net上使用LINQ,但我想知道它在内部是如何工作的?
有谁知道吗?
THKS.
询问LINQ的特定方面更有意义.这有点像问"Windows如何工作"否则.
从C#的角度来看,LINQ的关键部分对我来说是:
表达树.这些是代码作为数据的表示.例如,表达式树可以表示"获取字符串参数,在其上调用Length属性并返回结果"的概念.事实上,这些存在作为数据而不是编译代码意味着LINQ提供程序(如LINQ to SQL)可以分析它们并将它们转换为SQL.
Lambda表达式.这些是这样的表达式:
x => x * 2 (int x, int y) => x * y () => { Console.WriteLine("Block"); Console.WriteLine("Lambda"); }
Lambda表达式转换为委托或表达式树.
匿名类型.这些是这样的表达式:
new { X=10, Y=20 }
这些仍然是静态类型的,只是编译器为您生成具有属性X
和的不可变类型Y
.通常使用var
它们,允许从其初始化表达式推断出局部变量的类型.
查询表达式.这些是这样的表达式:
from person in people where person.Age < 18 select person.Name
这些由C#编译器转换为"普通"C#3.0(即不使用查询表达式的表单).之后应用重载分辨率等,这对于能够使用具有多种数据类型的相同查询语法是绝对关键的,而编译器不具有诸如Queryable之类的任何类型的知识.上述表达将被翻译成:
people.Where(person => person.Age < 18) .Select(person => person.Name)
扩展方法.这些是静态方法,可以像使用第一个参数类型的实例方法一样使用.例如,像这样的扩展方法:
public static int CountAsciiDigits(this string text) { return text.Count(letter => letter >= '0' && letter <= '9'); }
然后可以像这样使用:
string foo = "123abc456"; int count = foo.CountAsciiDigits();
注意,执行CountAsciiDigits
使用另一种扩展方法,Enumerable.Count()
.
这是大多数相关的语言方面.然后是LINQ提供程序中的标准查询运算符的实现,例如LINQ to Objects和LINQ to SQL等.我有一个关于如何实现LINQ to Objects相当简单的演示文稿 - 它位于C#的"Talks"页面上在深度网站.
LINQ to SQL等提供程序的工作方式通常是通过Queryable
类.他们的核心是将表达式树转换为其他查询格式,然后使用执行这些进程外查询的结果构造适当的对象.
这涵盖了您感兴趣的一切吗?如果有什么特别的东西你仍然想知道,只需编辑你的问题,我就会去.
LINQ基本上是这些C#3.0离散功能的组合:
局部变量类型推断
自动属性(未在VB 9.0中实现)
扩展方法
lambda表达式
匿名类型初始化器
查询理解
有关到达目的地(LINQ)的更多信息,请参阅LANGNET 2008中Anders的视频:
http://download.microsoft.com/download/c/e/5/ce5434ca-4f54-42b1-81ea-7f5a72f3b1dd/1-01%20-%20CSharp3%20-%20Anders%20Hejlsberg.wmv