LINQ如何在内部工作?

rpf*_*rpf 55 linq

我喜欢在.net上使用LINQ,但我想知道它在内部是如何工作的?

有谁知道吗?

THKS.

Jon*_*eet 81

询问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"); }
    
    Run Code Online (Sandbox Code Playgroud)

    Lambda表达式转换为委托表达式树.

  • 匿名类型.这些是这样的表达式:

    new { X=10, Y=20 }
    
    Run Code Online (Sandbox Code Playgroud)

    这些仍然是静态类型的,只是编译器为您生成具有属性X和的不可变类型Y.通常使用var它们,允许从其初始化表达式推断出局部变量的类型.

  • 查询表达式.这些是这样的表达式:

    from person in people
    where person.Age < 18
    select person.Name
    
    Run Code Online (Sandbox Code Playgroud)

    这些由C#编译器转换为"普通"C#3.0(即不使用查询表达式的表单).之后应用重载分辨率等,这对于能够使用具有多种数据类型的相同查询语法是绝对关键的,而编译器不具有诸如Queryable之类的任何类型的知识.上述表达将被翻译成:

    people.Where(person => person.Age < 18)
          .Select(person => person.Name)
    
    Run Code Online (Sandbox Code Playgroud)
  • 扩展方法.这些是静态方法,可以像使用第一个参数类型的实例方法一样使用.例如,像这样的扩展方法:

    public static int CountAsciiDigits(this string text)
    {
        return text.Count(letter => letter >= '0' && letter <= '9');
    }
    
    Run Code Online (Sandbox Code Playgroud)

    然后可以像这样使用:

    string foo = "123abc456";
    int count = foo.CountAsciiDigits();
    
    Run Code Online (Sandbox Code Playgroud)

    注意,执行CountAsciiDigits使用另一种扩展方法,Enumerable.Count().

这是大多数相关的语言方面.然后是LINQ提供程序中的标准查询运算符的实现,例如LINQ to Objects和LINQ to SQL等.我有一个关于如何实现LINQ to Objects相当简单的演示文稿 - 它位于C#的"Talks"页面上在深度网站.

LINQ to SQL等提供程序的工作方式通常是通过Queryable类.他们的核心是将表达式树转换为其他查询格式,然后使用执行这些进程外查询的结果构造适当的对象.

这涵盖了您感兴趣的一切吗?如果有什么特别的东西你仍然想知道,只需编辑你的问题,我就会去.


Eri*_*ono 5

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

  • 自动属性在LINQ中不起作用,不在VB9中. (2认同)