为什么需要LINQ?
面向对象的编程语言已经成为企业应用开发的重要工具,ADO.NET对关系数据提供了一种方便的接口,但还不是一种面向对象的方法。例如,下面的伪代码:
User u = new User(); //代表user表的一个User类
u.LoginName = "net_lover" //设置一个LoginName标识
u.Load(); .//加载用户信息
u.Title = "【孟子E章】"; //将Title修改为【孟子E章】
u.Update(); //将修改的数据更新到数据库。
这段伪代码说明了管理数据的一种面向对象的方法,对开发人员来说,看不到查询或SQL语句。你只需关心的只是做什么,而无需关心怎么做。这种将面向对象和关系数据结合在一起的方法叫做对象关系映射(ORM)模型,这样的方法简化了枯燥的数据操作,简洁明了。
关于ORM,在Java世界里有很多框架,但在.NET Framework里还比较少,NHibernate就是Microsoft
.NET平台下ORM的实现,它的目的是将开发人员从大量的关系数据持久化相关的编程中解放出来。目前,NHibernate的稳定版本是NHibernate
1.2.1,于2007年11月份发布,加入了Hibernate 3中的更多功能,并且支持 .NET 2.0,存储过程,泛型和可为空类型。NHibernate
2.0目前正在开发中。毕竟NHibernate属于开源的代码,不是微软自己的东西,而且它处理的数据源也有限。VS
2005中NHibernate的插件下载地址:http://sourceforge.net/projects/nhibernateaddin。
尽管微软在Dynamics 3.0应用服务器中嵌入了ORM功能,并且在ADO.NET 3.0中将广泛支持此功能,但是还仍然没有将这种编程模型提供给.NET开发人员。ADO.NET中数据的操作采用的是Command或者DataAdapter对象来操作关系数据库,但需要自己写的代码很多,并且需要自己写SQL语句。
.NET也提供了处理XML和非关系数据源,但是我们必须了解其他的方法来查询信息,比如XPath或者XQuery。
现在,可以编程管理的数据可能来自不同的数据域,如数组、对象关系图、XML文档、数据库、文本文件、注册表、电子邮件消息、简单对象访问协议(SOAP)信息内容、Microsoft
Office Excel文件等等很多。每种数据域都有自己特定的访问模型,例如,当查询数据库时,通常使用SQL,当遍历XML数据时,使用Document
Object Model(DOM)或者XPath、XQuery,当遇到数组是采用遍历的方法,对于对象关系图,则需要自己创建算法,对于Excel文件,电子邮件消息或者Microsoft
Windows注册表,要访问他们,则需要使用特定的应用程序编程接口(API)。到最后,访问不同的数据源就要使用不同的编程模型。
将多种数据访问技术统一到一个全面的模型也曾出现过,例如:开放数据库互联(ODBC)提供者允许开发人员以一种类似SQL的语言通过关系模型访问数据。在某些时候,数据以层次或者图形模型来表示更加符合数据的本质含义。另外,如果数据模型没有与编程语言结合在一起,就可能需要编程人员自己管理不同的类型体系。所有这些差别在数据和代码之间产生一种“阻抗失谐”。LINQ就是解决这些问题的技术,它提供统一的访问和管理数据的方法,并且不是采取“一刀切”的模型来实现。LINQ在这些数据模型之间均衡操作直接的共同特性,而不是在他们之间将不同的结构变成统一。
什么是LINQ?
LINQ是Language Integrated Query的缩写,翻译成汉语就是语言集成查询。搜索一下网络,可以发现很多关于LINQ的描述:
1,LINQ是所有类型数据的统一编程模型,它可以让你使用一致的模型查询和使用数据,而不用关心数据源是什么。
2,LINQ是一种将SQL查询嵌入到代码中的另一种工具
3,LINQ是另外一种数据抽象层。
以上这些描述在某种程度上都是正确的,但每种描述都仅仅集中在一个方面。LINQ能够做的事情远远比嵌入的SQL查询要多很多,它也比“统一的编程模型”更容易使用,同时也远不止是数据模型的另外一套规则。
LINQ是一套简化和统一数据访问的实现方法。LINQ并不是要求你使用一种特定的架构,它使一些现有访问数据架构的实现更加便利。和使用其他工具一样,LINQ也存在好和坏两个方面。要从LINQ中得到最好的东西,就需要对它有所精通。
LINQ是一个编程模型,将查询作为一流的概念引入到Micosoft .NET语言中。当然,这需要编程语言和框架(.NET
Framework 3.5)的支持。
下面的代码将在页面上的GridView2中显示Country为USA客户名称:
NorthWindDataContext NorthWind = new NorthWindDataContext();
var query = from c in NorthWind.Customers where c.Country == "USA" select c.CompanyName;
GridView2.DataSource = query;
GridView2.DataBind();
当然,也可以在ASPX页面里进行设置:
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title>LINQ 学习</title>
</head>
<body>
<form id="form1" runat="server">
<div>
<asp:GridView ID="GridView1" runat="server" DataSourceID="LinqDataSource1" AllowSorting="True"
AutoGenerateColumns="False">
<Columns>
<asp:BoundField DataField="CompanyName" HeaderText="CompanyName" ReadOnly="True"
SortExpression="CompanyName" />
<asp:BoundField DataField="ContactName" HeaderText="ContactName" ReadOnly="True"
SortExpression="ContactName" />
<asp:BoundField DataField="Country" HeaderText="Country" ReadOnly="True" SortExpression="Country" />
</Columns>
</asp:GridView>
</div>
<asp:LinqDataSource ID="LinqDataSource1" runat="server" ContextTypeName="NorthWindDataContext"
Select="new (CompanyName, ContactName, Country)" TableName="Customers" Where="Country == @Country">
<WhereParameters>
<asp:Parameter DefaultValue="USA" Name="Country" Type="String" />
</WhereParameters>
</asp:LinqDataSource>
<hr />
<asp:GridView ID="GridView2" runat="server">
</asp:GridView>
</form>
</body>
</html>
实现上面数据显示的过程如下:
1,建立Target Framework 3.5的网站
2,添加新项:LINQ to SQL Class,并命名为NorthWind.dbml
3,提示你是否加入到App_Code文件夹,为安全考虑,点“是”加入
4,打开Server Explorer,将NorthWind数据库里面的Customers表拖到对象关系映射设计器
5,从工具箱中将LinqDataSource控件拖到aspx设计器,并进行配置数据源,选择NorthWindDataContext
6,选择表和数据列
7,点击Where设置查询条件
8,单击“Add”,然后单击“ok”-“ Finish”
9,从工具箱拖进两个GridView控件,配置GridView1的数据源为LinqDataSource1
10,在代码设计器里输入下面的代码:
protected void Page_Load(object sender, EventArgs e)
{
NorthWindDataContext NorthWind = new NorthWindDataContext();
var query = from c in NorthWind.Customers where c.Country == "USA" select new { c.Country, c.CompanyName };
GridView2.DataSource = query;
GridView2.DataBind();
}
预览页面,结果如下:
|