什么是Linq,它有什么作用?
什么是Linq? 我知道这是数据库,但它是做什么的?
Linq代表语言集成查询
而不是编写YAQL(另一种查询语言),MS语言开发人员提供了直接用他们的语言(如c#和vb)expression查询的方法。 形成这些查询的技术并不依赖于被查询事物的实现细节,因此您可以针对多个目标(数据库,内存中的对象,xml)编写有效的查询,而几乎不考虑其中的底层方法查询将被执行。
让我们从属于.Net Framework(3.5)的部分开始这个探索。
-
Linq To Objects – 查询System.Linq.Enumerable查询方法。 这些目标是
IEnumerable<T>
,允许以types安全的方式查询任何types的可循环集合。 这些查询依赖于编译的.Net方法,而不是expression式。 -
Linq To Anything – 查看一些查询方法的System.Linq.Queryable 。 这些目标是
IQueryable<T>
,允许构build可以被底层实现转换的expression式树。 -
expression式树 – 检查System.Linq.Expressions名称空间。 这是代码作为数据。 在实践中,你应该知道这些东西,但是并不需要针对这些types编写代码。 语言function(如lambdaexpression式)可以让您使用各种短手来避免直接处理这些types。
-
Linq To Sql – 检查System.Data.Linq命名空间。 尤其要注意
DataContext
。 这是C#团队构build的一个DataAccess技术。 它只是工作。 -
Linq To Entities – 检查System.Data.Objects命名空间。 尤其要注意
ObjectContext
。 这是ADO.Net团队build立的一个DataAccess技术。 它比Linq To Sql复杂,function强大且难于使用。 -
Linq To Xml – 检查System.Xml.Linq命名空间。 基本上,人们对
System.Xml
的东西不满意。 所以MS重新编写它,并利用重写来介绍一些方法,使得更容易使用LinqToObjects对Xml。 -
一些不错的帮手types,如Func和Action 。 这些types是具有通用支持的代表。 宣布自己的自定义(和不可互换)委托types的日子已经一去不复返了。
以上所有都是.Net框架的一部分,并且可以从任何.Net语言(vb.net,c#,iron python,cobol.net …)获得。
好的,到语言function。 我将坚持到C#,因为这是我最了解的。 Vb.Net也有几个类似的改进(和一些C#没有得到 – Xml文字)。 这是一个简短而不完整的清单。
-
扩展方法 – 这可以让你“添加”一个方法来input。 这个方法实际上是一个静态方法,它传递了一个types的实例,并且被限制在这个types的公共约定中,但是对于你不控制的types添加方法(string),或者添加(完全实现)辅助方法到接口。
-
查询理解语法 – 这可以让你写一个Sql Like结构。 所有这些东西被转换为System.Linq.Queryable或System.Linq.Enumerable(取决于myCustomers的types)的方法。 这是完全可选的,你可以使用Linq没有它。 这种查询声明的一个优点是范围variables的范围是:它们不需要为每个子句重新声明。
IEnumerable<string> result = from c in myCustomers where c.Name.StartsWith("B") select c.Name;
-
Lambdaexpression式 – 这是指定方法的简写。 C#编译器将把每一个转换成一个匿名方法或一个真正的
System.Linq.Expressions.Expression
。 你真的需要了解这些才能使用Linq。 有三个部分:参数列表,箭头和方法体。IEnumerable<string> result = myCustomers .Where(c => c.Name.StartsWith("B")) .Select(c => c.Name);`
-
匿名types – 有时编译器有足够的信息来为你创build一个types。 这些types不是真正的匿名的……编译器在创build它们的时候命名它们。 但是这些名字是在编译时创build的,对于开发人员在devise时使用这个名字来说已经太迟了。
myCustomers.Select(c => new { Name = c.Name; Age = c.Age; })
-
隐式types – 有时编译器有足够的信息从初始化,它可以找出你的types。 您可以通过使用var关键字来指示编译器这样做。 为匿名types声明variables需要隐式types,因为程序员可能不使用匿名types的名称。
//The compiler will determine that names is an IEnumerable<string> var names = myCustomers.Select(c => c.Name);
LINQ(语言集成查询)可能指的是:
-
用于收集和迭代器操作的库,广泛使用高阶函数作为参数(System.Linq)
-
用于传递和操纵简单函数的库,如抽象语法树(System.Linq.Expressions)
-
为各种语言提供语法扩展,以提供更加类似于SQL的语法来处理集合,为匿名函数提供更紧凑的表示法,以及引入与最终成员函数语法无法区分的静态帮助函数的机制
-
数据提供者为了接收查询结构而可能符合的接口定义,并可能在其上执行优化,或偶尔地兼容数据提供者本身
这些组件可以单独使用或组合使用。
简而言之,LINQ(语言集成查询)允许您直接在您的代码中编写查询。 这些查询可以在关系数据库上,也可以在XML或内存容器对象(如数组和列表)上。 更多信息在MSDN库中可用: http : //msdn.microsoft.com/en-us/library/bb308959.aspx
我将尝试一个简单的答案:LINQ是一种使用类似于SQL的查询语言查询数据库(或其他数据存储区,XML等)的方式,但可以在.NET应用程序中进行编译。
LINQ是一种使用从C#编程语言派生的习惯用法来提取数据的技术。 尽pipeSQL在functiondevise方面有很大的欠缺,但它从根本上来说是它自己的数据查询语言。 它运行在广泛的数据源(SQL数据库,内存表示,XML等)上。 特别是,LINQ-to-SQL应该被看作是与SQL编程和C#/ VB编程之间常常被称为“阻抗不匹配”的embedded式SQL的传统使用形成对照。
对于LINQ及其局限性的讨论,你可能想看看这个相关的问题: LINQ to SQL没有错过重点?
LINQ代表语言集成查询 ,是在CLR中提供通用“查询”机制的一种方式。
在最基本的层面上,它由IEnumerable <T>上的一组方法组成,例如,Select,Sum,Where – 可用于限制,投影等[1]
为了更进一步,LINQ还定义了一个新的LINQ提供者模型,它可以采用expression式树并使用它来针对CLR之外的数据源运行“原生”查询 – 例如,LINQ to SQL,LINQ to XML,LINQ到NHibernate等
C#和VB.NET也定义了一种查询语法,允许你编写内联的强types查询语言(与SQL非常相似),然后编译器将其翻译成等效的IEnumerable <T>调用。
对我来说,关于LINQ的最有趣的事情是所有需要支持它的C#和VB.NET特性都是非常有用的。 扩展方法,匿名types,lambdaexpression式和隐式types都需要支持LINQ,但我们倾向于在纯LINQ上下文之外使用这些特性。
[1]这些是关系术语,function程序员可能更喜欢Map,Reduce,Fold等。
http://msdn.microsoft.com/en-us/netframework/aa904594.aspx
“LINQ项目是.NET Framework扩展的一个代号,它包含语言集成的查询,设置和转换操作,它扩展了C#和Visual Basic语言的查询语法,并提供了类库来利用这些function“。