当前位置:  开发笔记 > 编程语言 > 正文

LINQ如何在内部工作?

如何解决《LINQ如何在内部工作?》经验,为你挑选了2个好方法。

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

有谁知道吗?

THKS.



1> Jon Skeet..:

询问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类.他们的核心是将表达式树转换为其他查询格式,然后使用执行这些进程外查询的结果构造适当的对象.

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



2> Eriawan Kusu..:

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中.
推荐阅读
贾志军
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有