LINQ实战阅读笔记--第一章 LINQ简介

1.1  LINQ是什么

最初,LINQ的设计目的就是为了解决在.NET编程语言中遇到的概念和技术上的难题。对于LINQ,微软公司开始只是希望其能够给出一个对象/关系映射的解决方案,并简化对象和数据源之间的交互过程。不过,LINQ最终却演化成了一个通用的、语言结成的查询工具。使用这个工具,可以访问来自内存对象(LINQ to Object)、数据库(LINQ to SQL)、XML文档(LINQ to XML)、文件系统等多种数据源中的数据。

LINQ 或许就是数据和一般编程语言两个领域之间的那个确实的链接。

下面先给出一个使用LINQ写出的一段C#代码。


var contacts =
       from customer in db.Customers
       wherecustomer.Name.StartsWith("A")&& customer.Orders.Count>0
       orderby customer.Name
       select new { customer.Name,customer.Phone};
 
var xml = newXElement("contacts",
       from contact in contacts
       select new XElement("contact",
              newXAttribute("name",contact.Name),
              newXAttribute("phone",contact.Phone)
       )
);


上述代码演示了从数据库中获取数据,并创建XML文档的完整过程。目前,LINQ支持C#3.0和VB.NET 9.0(也叫做VB2008),且需要专门的编译器,但也可以迁移到其他.NET语言中,如F#。

LINQ不是一种新语言,它完全集成在了C#和VB.NET中。此外,LINQ让你的.NET程序不必纠结于SQL、XSL或其他数据相关的语言中。这些LINQ提供的语言扩展允许把对若干中不同数据源的查询直接集成至编程语言中。可以将LINQ想想成一个万能遥控器。有事你会用它查询数据库,而有事会用它查询XML文档。不过所有的操作都是在你最熟悉的语言中进行的,无须切换其他语言(例如SQL或XQuery)。

 

1.2  为什么需要LINQ

最初设计LIQN时,其目的确实简单:大多数应用程序都需要访问关系型数据库。因此,若想开发应用程序的话,仅学习一种语言(比如C#)是不够的,还需要掌握SQL以及将SQL与C#集成起来的相关API。

引入LINQ的动机主要有两个:一是微软尚未有一套数据映射解决方案,二是借助LINQ能投将查询集成至开发语言中。

LINQ的设计目的在于,开发人员可以在其熟悉的语言中使用统一的查询访问任何数据源。

1.3  LINQ项目的设计目标

下图列出了微软公司为LINQ项目设定的目标,这也能帮助你更好地理解LINQ所提供的各种功能。

LINQ的另外一个重要功能是它支持强类型。这意味着:

1.为所有的查询提供了编译时检查。与现有的SQL语句只能在运行时发现错误不同,在开发过程中你即可找到程序中潜在的错误。这自然会降低产品后期才发现问题的可能性。大多数情况下的问题均是认为造成的。强类型查询则能够很容易地帮助我们找到诸如拼写错误之类的低级问题。

2.在Visual Studio中编写LINQ查询时,可以使用智能感知。智能感知不仅能投提高编写代码的速度,还可以大大简化操作复杂集合或复杂数据模型的过程。

 

1.4  LINQ to Objects初步:查询内存中的集合

先给出第一个C# LINQ实例程序

using System;
using System.Linq;
 
static classHelloWorld
{
       static void Main()
       {
              string[] words = {"hello","wonderful","Linq","beautiful","world"};
             
              var shrotWords = from word inwords where word.Length<=5
              select word;
 
              foreach(var word in shortWords)
                     Console.WriteLine(wrod);
       }
}

C#版本的Hello LINQ,增加了分组和排序功能。

using System;
using System.Linq;
 
static classHelloWorld
{
       static void Main()
       {
              string[] words = {"hello","Linq","beautiful","world" };
 
              var groups = from word in wordsorderby word ascending
              group word by word.Length intolengthGroups
              orderby lengthGroups.Keydescending
              select new {Length=lengthGroups.Key,Words=lengthGroups };
 
              foreach(var group in groups)
              {
                     Console.WriteLine("wordsof length"+group.Length);
                     foreach(string word ingroup.Words)
                            Console.WriteLine(""+word);
              }
       }
}

你可以试试用传统方法的实现。你会发现需要很多代码,并且要频繁的操作集合。LINQ的第一个优势—强大的表达能力—在该示例中尽显无遗:LINQ让我们能够用声明的方式在查询中表达将要实现的目的,而无需编写大量的间接代码。除了支持这种优雅的、类似于SQL的查询之外,LINQ也提供了一系列函数,例如sum、min、Max和Average等,使我们可以执行更加丰富的操作。有些人发现LINQ和SQL的语法有相似的地方,但是好像查询思路是相反的啊?SQL的查询顺序是先通过select写出要查询的字段,然后在写出查询的范围from那张表,而LINQ是先from那个实体最后才是select要选出的字段。为什么不把LINQ的语法设计的跟SQL一样啊?这样不是可以减少学习成本吗?答案是这样的LINQ之所以选用这种先大范围然后在写要查询的字段是为了智能感应。试想如果你一开始就select那些字段,VS是不知道这些字段是属于哪个实体的,而如果你先确定实体,然后你select字段时VS就可以通过智能感应给你列出实体中可选的字段。虽然这样写习惯了SQL的程序员初次接触到LINQ时感觉有点别扭,但是如果你掌握了这种写法以后,通过智能感应可以提高不少工作效率。

1.5  LINQ to XML 初步:查询XML文档。

1.5.1为什么需要 LINQ to XML

         XML在当今的应用非常广泛,一般语言编写的应用程序中经常会用到XML。但是大多数编程语言都没有对XML提供原生的支持,而通常要使用各种API来处理XML数据。现有的一些API包括XmlDocument、XmlReader、XPathNavigator、XSLT的XslTransForm以及SAX和XQuery的实现等。问题是这些API均无法很好的集成至编程语言中,哪怕是非常简单的工作,也会需要很多行无关紧要的代码。

LINT to XML 扩展了LINQ所提供的集成至语言中的查询功能,让其能够支持XML。LINQ to XML 让我们在熟悉的编程语言中能够使用类似XPah和XQuery那样的表达能力,并且提供了类型安全以及代码只能感知功能。

LINQ to XML和 XML DOM的比较

1.5.2 Hello LINQ to XML

C#版本的 Hello LINQ to XML

using System;
using System.Linq;
using System.Xml;
usingSystem.Xml.Linq;
 
class Book
{
       public string Publisher;
       public string Title;
       public int Year;
 
       public Book(string title,stringpublisher,int year)
       {
              Title = title,
              Publisher = publisher;
              Year = year;
       }
}
 
static classHelloLinqToXml
{
       static void Main()
       {
              Book[] books = new Book[]{
                     new Book("Ajax inAction","Manning",2005),
                     new Book("WindowsForms in Action","Manning",2006),
                     new Book("RSS and Atomin Action","Manning",2006)
              };
              XElement xml = newXElement("books",
                     from book in books
                     where book.Year ==2006
                     select newXElement("book",
                            newXAttribute("title",book.Title),
                            newXElement("publisher",book.Publisher)
                     )
              );
              Console.WriteLIne(xml);
       }
}

1.6  LINQ to SQL 初步:查询关系型数据库

1.6.1 LINQ 的设计目标是将查询语言自然无缝地集成至编程语言中。LINQ to SQL(从前叫做DLinq)也遵循了这个设计理念,力求让开发人员能够使用于LINQ to Object 和 LINQ to XML 同样的语法来查询关系型数据库。

1.6.2 Hello LINQ to SQL

下面来看一些实际的LINQ  to  SQL 代码,这段C#代码将根据城市对位于内存中的一个联系人列表进行过滤:

         Fromcontact in contacts  Where contact.City==”Paris”  Select contact;

在LINQ to SQL 中,为从关系型数据库中获取数据而执行同样的操作也非常直接:

From coantact indb.GetTable<Contact>()

Where contact.City==”Paris”

Select contact;

该查询将对数据库中的联系人列表进行操作。这两个查询基本没什么差别,仅被操作的对象有所不同,而查询语法则完全一致。这表明,LINQ允许我们用同样的方法处理多种数据,LINQ之所以强大就在于此!!

关系型数据库中使用的是SQL语言。因此LINQ查询必须在某些时候被转换成实际的SQL语句。这也是该技术的核心:在第一个实例中,将在内存中遍历集合;而在第二段代码中,查询将用来生成一条SQL语句并发送给数据库服务器。对于这个LINQ  to SQL 示例而言,实际的处理过程发生在数据库服务器上。更重要的是,这些查询都是强类型的,而

1.      实体类

创建LINQ to SQL 应用程序的第一步是声明用来表示数据的类:实体类。

2.      DataContext

在开始使用语言集成查询之前,还需要准备一个System.Data.Linq.DataContext对象。

DataContext(数据上下文)的作用在于它能将对对象的查询转换成SQL语句并发送给数据库执行,随后再将数据库的返回值构造成对象。

这里使用Northwnd.mdf数据库

String path = Path.GetFullPath(@“..\..\..\Data\northwnd.mdf”);

DataContext db = new DataContext(path);

DataContext 类的构造函数需要传入一个连接字符串作为参数。因为我们使用的是SQL2005,因此只需闯入数据库文件的路径即可。

该DataContext对象将用来支持访问该数据库中的数据表。使用下面这行代码即可访问映射到Contact类的Contacts数据表:

Table<Contact> contacts =db.GetTable<Contact>();

DataContext.GetTable是一个泛型方法,允许程序操作强类型的对象,这也是LINQ查询语句的一大特征。

Hello LINQ to SQL 的完整代码

using System;
using System.Linq;
usingSystem.Data.Linq;
usingSystem.Data.Linq.Mapping;
 
static classHelloLinqToSql
{
       [Table(Name="Contacts")]
       class Contact
       {
              [Column(IsPrimaryKey=true)]
              public int ContactID{get;set;}
              [Column(Name="ContactName")]
              public string Name{get;set;}
              [Column]
              public string City{get;set;}
       }
 
       static void Main()
       {
              string path =System.IO.Path.GetFullPath(@"");
              DataContext db = newDataContext(path);
              var contacts =
                     from contact indb.GetTable<Contact>()
                     wherecontact.City=="Paris"
                     select contact;
 
              foreach(var contact in contacts)
                     Console.WriteLine("Bonjour"+contact.Name);
       }
}

执行上述代码将得到如下输出:

Bonjour MarieBertrand

Bonjour Dominique Perrier

Bonjour Guylene Nodier

下面则是有上述查询转换成的、时间发送给数据库的SQL查询:

SELECT [t0].[ContactID], [t0].[ContactName]AS [Name], [t0].[City]

FROM [Contacts] AS [t0]

WHERE [t0].[City]=@p0

总结一下LINQ to SQL自动实现的一些功能:打开与数据库的连接、生成SQL查询、将执行结果填充至对象中。

传统代码相对于LINQ  to  SQL的不足:以字符串形式给出的SQL语句、没有编译时检查、松散绑定的参数、弱类型的结果集、代码冗长、需要掌握更多技能。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值