中国开发网: 论坛: .NET/C#: 贴子 682753
cndevr:语言集成查询(LINQ)简介及如何使用
语言集成查询(LINQ)简介及如何使用


问题

  语言集成查询(LINQ)是Visual Studio 2008和.NET框架中具有开创性的创新,它是连接了对象世界和数据世界的纽带。LINQ是SQL Server 2008中开发改进的一部分,我想知道它是怎么工作的以及我该怎样在其它管理领域而不仅仅是SQL Server中使用它。

  专家解答

  下面开始介绍LINQ。LINQ是对.NET框架一组扩展集的项目名称,这组扩展集围绕语言集成查询、集合和转换操作。它使用本地语言语法扩展了C#和VB用于查询并提供了类库来利用这些功能,这些只在.NET Framework 3.5中可用。对于编写经常访问记录集的开发人员来说这意味着很多。事实上,查询经常以专门的查询语言来表达不同的数据源,这使得开发人员很难为他们要访问的每个数据源或每种数据格式学习一种查询语言。这就是LINQ要做的。它通过提供一个兼容模型用于使用各种数据源和数据格式的数据,从而简化了数据访问。在LINQ中,数据被翻译成了对象,易于开发人员使用。学习LINQ将会使我们了解它的功能和它的益处。

  创建一个简单的LINQ项目

  下面使用Visual Studio 2008中的C#语言创建一个简单的控制台项目。确保你从目标框架下拉列表框中选择了.NET Framework 3.5。 



  这将打开你的Program.cs文件。注意在.NET Framework 3.5下简单创建的项目会自动为System.Linq命名空间添加一个使用指示,因为这已经是System.Core装配的一部分。System.Linq命令空间提供了类和接口,它们支持使用LINQ的查询。我们将从它开始了解LINQ的基本内容。 



  下面在static void Main(string[] args)中编写一些代码:

//Obtaining the data source
string[] carNames = {"Ferrari", "Porsche", "Mercedes" , "McLaren", "Audi", "BMW"};

// Create the query
// query is an IEnumerable
var query = from name in carNames
where name.Contains("e")
select name;

// Execute the query
foreach (string name in query)
{
Console.WriteLine(name);
}
//Pause the application
Console.ReadLine();



  我们将检查一个LINQ查询的基本组成部分。任何LINQ查询都是由三个独立的动作组成的。它们是获得数据源、创建查询和执行这个查询。我们要做的第一件事是获得数据源。在这种情况下,它是一个字符串数组,支持一般的IEnumerable(T)接口。这使得它可用于LINQ to query。一个可查询类型不需要进行特殊修改就可以用作LINQ数据源,只要它已经加载进了内存。如果没有,那么你需要将它加载进内存以便LINQ可以查询这些对象。这适用于像XML文件之类的数据源。接下来,是查询。一个查询指定要从数据源获取的信息。这类似于SQL查询,它包含像SELECT、FROM、WHERE、GROUP BY的语法。看一下上面的代码,你会注意到它不像你一般的SQL语句,它的FROM条件从句出现在SELECT语句之前。这有两个原因。第一,它是符合在使用变量之前进行定义的编程理念。再有,从Visual Studio的角度来看,这使得当变量已经定义了而框架也已经推断出对象的正确类型时很容易使用点(.)符号提供IntelliSense特性。这提供了合适的属性和方法,使得开发人员很容易编写他们的代码。 



  让我们看看代码的结构是怎样的。from条件从句指定了数据源,在这个例子中是carNames集合。where条件应用了过滤器,在这个例子中,是集合中所有包含字母“e”的元素列表。select条件从句指定了返回元素的类型。有一个例子可以创建具有更少属性的对象实例。这个查询变量query只存储当查询执行时或之后的某个时间点生成这些结果所需的信息。简单地定义这个查询变量不会返回任何数据或执行任何动作。上面代码的第三个组成部分是查询执行。正如我所提到的,查询变量不包含任何数据,只包含查询命令。这个查询的实际执行是当我们迭代完这个查询变量。有两个方法来这么做。第一是上面所显示的。用一个foreach语句迭代这个查询变量并执行它。这个理念叫做延迟查询执行。当处理数据源例如高度事务型数据库系统时这是非常重要的,因为你要将对数据库的连接降低到最少,除非必要(数据库连接是数据库服务器上的额外资源)。你可以选择使用聚合功能像Count、Max、Average和First或者调用ToList()或ToArray()方法来立即执行这个查询。另一个方法是将这个集合绑定到web或窗口表单控件中的一个数据绑定控件,类似于你在Visual Studio之前版本中所做的——指定这个控件的DataSource属性为这个查询变量并调用DataBind()方法。

  在这个代码中要强调的另一个方面是对关键字var的使用,这是在C# 3.0中引入的新关键字。它所做的是查看赋给这个变量的值,然后决定和设置合适的值。这个理念叫做类型推导。从上面的代码,这个查询变量query显示为一个字符串数组。所以编译器自动假设它是一个IEnumerable类型的变量。如果你不知道运行时这个变量的类型,那么这是很有用的。但是这不意味着在最初的赋值之后任何类型都可以赋给这个变量——像一个动态类型——因为.NET是一个强大的强类型语言平台。这简单地说就是一个对象可以赋为一个不同类型而编译器会很容易地处理。对一个已有的对象赋为一个不同类型是与面向对象编程中的多态理念相冲突的。假设你给这个查询变量query赋值12。这将会抛出一个类型转换异常,因为这个变量的原始类型是一个字符串集合。

  当你在Visual Studio中运行你的项目时,你的输出将看起来如下所示。你可以按下F5或点击Debug ——来启动Visual Studio中的调试。 
大家使用多了,就会发现LINQ是一个很好的工具。建议大家抽空多学习一下。毕竟这也是.net技术发展的一个趋势。学习时候可以参考一下人邮的《精通LINQ数据访问技术》,具体网址http://www.china-pub.com/39938。虽然不是什么经典书,但是快速入门,已经足够了。

相关信息:


欢迎光临本社区,您还没有登录,不能发贴子。请在 这里登录