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

什么是LINQ,它做什么?

如何解决《什么是LINQ,它做什么?》经验,为你挑选了6个好方法。

什么是LINQ?我知道它适用于数据库,但它有什么作用?



1> Amy B..:

LINQ代表语言集成查询.

Microsoft语言开发人员提供了一种直接在其语言中表达查询的方法(例如C#和Visual Basic),而不是编写YAQL(又一种查询语言).形成这些查询的技术不依赖于被查询事物的实现细节,因此您可以针对许多目标(数据库,内存中对象,XML)编写有效查询,而实际上不考虑其中的基本方式.查询将被执行.

让我们从属于.NET Framework(3.5)的部分开始探索.

LINQ To Objects - 检查System.Linq.Enumerable查询方法.这些目标IEnumerable允许以类型安全的方式查询任何类型的loopable集合.这些查询依赖于编译的.NET方法,而不是表达式.

LINQ To Anything - 检查一些查询方法的System.Linq.Queryable.这些目标IQueryable,允许构建可由底层实现转换的表达式树.

表达式树 - 检查System.Linq.Expressions命名空间.这是代码作为数据.在实践中,您应该了解这些内容,但实际上并不需要针对这些类型编写代码.语言功能(例如lambda表达式)可以允许您使用各种短手来避免直接处理这些类型.

LINQ To SQL - 检查System.Data.Linq命名空间.特别注意DataContext.这是由C#团队构建的DataAccess技术.它只是有效.

LINQ To Entities - 检查System.Data.Objects命名空间.特别注意ObjectContext.这是由ADO.NET团队构建的DataAccess技术.它比LINQ To SQL复杂,强大且难以使用.

LINQ To XML - 检查System.Xml.Linq命名空间.从本质上讲,人们对这些东西并不满意System.Xml.因此,微软重新编写了它并利用重写来介绍一些方法,这些方法可以更容易地使用LINQ To Objects对抗XML.

一些不错的帮助器类型,例如Func和Action.这些类型是具有通用支持的代理.宣布自己的自定义(和不可互换的)委托类型的日子已经一去不复返了.

以上所有内容都是.NET Framework的一部分,可以从任何.NET语言(VB.NET,C#,IronPython,COBOL .NET等)获得.


好的,关于语言功能.我会坚持使用C#,因为这是我最了解的.VB.NET也有几个类似的改进(和一些C#没有得到的 - XML文字).这是一个简短且不完整的清单.

扩展方法 - 这允许您"添加"要键入的方法.该方法实际上是一个传递该类型实例的静态方法,并且仅限于该类型的公共协定,但它对于将方法添加到您不控制的类型(字符串)或添加(完全实现)非常有用. )接口的辅助方法.

查询理解语法 - 这允许您以SQL Like结构编写.所有这些东西都被转换为System.Linq.Queryable或System.Linq.Enumerable上的方法(取决于myCustomers的类型).它是完全可选的,没有它你可以很好地使用LINQ.这种查询声明方式的一个优点是范围变量是作用域的:不需要为每个子句重新声明它们.

IEnumerable result =
 from c in myCustomers
 where c.Name.StartsWith("B")
 select c.Name;

Lambda表达式 - 这是指定方法的简写.C#编译器会将每个转换为匿名方法或true System.Linq.Expressions.Expression.你真的需要了解这些才能很好地使用Linq.有三个部分:参数列表,箭头和方法体.

IEnumerable result = myCustomers
 .Where(c => c.Name.StartsWith("B"))
 .Select(c => c.Name);`

匿名类型 - 有时编译器有足够的信息为您创建类型.这些类型并不是真正的匿名:编译器在创建它们时命名它们.但这些名称是在编译时生成的,对于开发人员来说,在设计时使用该名称为时已晚.

myCustomers.Select(c => new 
{
  Name = c.Name;
  Age = c.Age;
})

隐式类型 - 有时编译器从初始化中获得足够的信息,它可以为您确定类型.您可以使用var关键字指示编译器执行此操作.为匿名类型声明变量需要隐式类型,因为程序员可能不使用匿名类型的名称.

// The compiler will determine that names is an IEnumerable
var names = myCustomers.Select(c => c.Name);



2> Jeffrey Hant..:

LINQ(语言集成查询)可以参考:

用于收集和迭代器操作的库,它广泛使用高阶函数作为参数(System.Linq)

用于传递和操作简单函数作为抽象语法树的库(System.Linq.Expressions)

各种语言的语法扩展,为处理集合提供更类似SQL的语法,为匿名函数提供更紧凑的表示法,以及引入静态辅助函数的机制,在语法上与最终成员函数无法区分

数据提供者可以遵循的接口定义,以便接收查询结构并可能在其上执行优化,或偶尔地对兼容数据提供者本身执行优化

组分可以单独使用或组合使用.



3> Vojislav Sto..:

简而言之,LINQ(语言集成查询)允许您直接在代码中编写查询.这些查询可以在关系数据库上,也可以在XML或内存容器对象(如数组和列表)上.MSDN库中提供了更多信息:http://msdn.microsoft.com/en-us/library/bb308959.aspx



4> jcollum..:

我将尝试一个简单的答案:LINQ是一种使用类似于SQL但可以在.NET应用程序内编译的查询语言来查询数据库(或其他数据存储区,XML等)的方法.


老实说,人们可以说SQL*应该写成`From Where Select,等等 - 也就是说它应该以结果集实际形成的方式编写

5> Mark Bracket..:

LINQ代表语言集成查询,是一种在CLR中提供通用"查询"机制的方法.

在它最基本的层面上,它由IEnumerable 上的一组方法组成 - 例如,Select,Sum,Where--可用于限制,投影等[1]

为了更进一步,LINQ还定义了一个新的LINQ提供程序模型,它可以使用表达式树并使用它来对CLR外部的数据源运行"本机"查询 - 例如,LINQ to SQL,LINQ to XML,LINQ到NHibernate等

C#和VB.NET还定义了一种查询语法,允许您编写内联强类型查询(看起来非常类似于SQL),然后编译器将其转换为等效的IEnumerable 调用.

对我来说,关于LINQ最有趣的事情是支持它所需的所有C#和VB.NET功能本身都很有用.扩展方法,匿名类型,lambda表达式和隐式类型都需要支持LINQ - 但我们倾向于在纯LINQ上下文之外使用这些功能.

[1]这些是关系术语,功能程序员可能更喜欢Map,Reduce,Fold等.



6> Mark Brittin..:

LINQ是一种使用从C#编程语言派生的习语来提取数据的技术.虽然它在SQL的功能设计中有很多,但它基本上是它自己的数据查询语言.它适用于广泛的数据源(SQL数据库,内存表示,XML等).特别是,LINQ-To-SQL应该被视为与嵌入式SQL的传统使用形成对比,后者在SQL编程和C#/ VB编程之间经常被称为"阻抗不匹配".

有关LINQ及其局限性的讨论,您可能需要看一下这个相关的问题:LINQ to SQL是否忽略了这一点?

推荐阅读
贴进你的心聆听你的世界
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有