跟我学LINQTOSQL编写者----唐宏涛一.LINQ简介什么是LINQLINQ分类如何使用LINQTOSQL对LINQ的迷惑一.LINQ简介什么是LINQLINQ是LanguageIntegratedQuery的简称,它是集成在.NET编程语言中的一种特性。已成为编程语言的一个组成部分,在编写程序时可以得到很好的编译时语法检查,丰富的元数据,智能感知、静态类型等强类型语言的好处。并且它同时还使得查询可以方便地对内存中的信息进行查询而不仅仅只是外部数据源。LINQ定义了一组标准查询操作符用于在所有基于.NET平台的编程语言中更加直接地声明跨越、过滤和投射操作的统一方式,标准查询操作符允许查询作用于所有基于IEnumerableT接口的源,并且它还允许适合于目标域或技术的第三方特定域操作符来扩大标准查询操作符集,更重要的是,第三方操作符可以用它们自己的提供附加服务的实现来自由地替换标准查询操作符,根据LINQ模式的习俗,这些查询喜欢采用与标准查询操作符相同的语言集成和工具支持。一.LINQ简介LINQ架构LINQ架构一.LINQ简介相关命名空间相关命名空间一.LINQ简介LINQ分类LINQ包括五个部分:LINQtoObjects、LINQtoDataSets、LINQtoSQL、LINQtoEntities、LINQtoXML。LINQtoSQL全称基于关系数据的.NET语言集成查询,用于以对象形式管理关系数据,并提供了丰富的查询功能。其建立于公共语言类型系统中的基于SQL的模式定义的集成之上,当保持关系型模型表达能力和对底层存储的直接查询评测的性能时,这个集成在关系型数据之上提供强类型。LINQtoXML在System.Xml.LINQ命名空间下实现对XML的操作。采用高效、易用、内存中的XML工具在宿主编程语言中提供XPath/XQuery功能等。一.LINQ简介如何使用LINQTOSQL第一步:建立dbml(DatabaseMarkLanguage.数据库描述语言,是一种XML格式的文档,用来描述数据库,有点类似Nhibernate的映射文件)第二步:创建一个ASP.NET页面,页面加入一个GridView控件第三步:编写代码进行数据绑定第四步:执行代码publicpartialclass_Default:System.Web.UI.Page{protectedvoidPage_Load(objectsender,EventArgse){if(!IsPostBack){BindData();}}publicvoidBindData(){NorthwindDataContextnt=newNorthwindDataContext();GridView1.DataSource=fromcinnt.Customersselectc.Orders;GridView1.DataBind();}}一.LINQ简介对LINQ迷惑LINQ是在ADO.NET之上的,那么在将来它会代替ADO.NET吗?在大型项目中使用LINQ,它的效率如何呢?二.DataContenxt作用功能Linq基本语法解析二.DataContext---作用作用DataContext类型(数据上下文)是System.Data.Linq命名空间下的重要类型,用于把查询句法翻译成SQL语句,以及把数据从数据库返回给调用方和把实体的修改写入数据库。二.DataContext---功能功能以日志形式记录DataContext生成的SQL执行SQL(包括查询和更新语句)创建和删除数据库DataContext是实体和数据库之间的桥梁,那么首先我们需要定义映射到数据表的实体。二.DataContext---定义实体类定义实体类以Northwind数据库为例,右边Customer类被映射成一个表,对应数据库中的Customers表。然后在类型中定义了三个属性,对应表中的三个字段。其中,CustomerID字段是主键,如果没有指定Column特性的Name属性,那么系统会把属性名作为数据表的字段名,也就是说实体类的属性名就需要和数据表中的字段名一致。usingSystem.Data.Linq.Mapping;[Table(Name=Customers)]publicclassCustomer{[Column(IsPrimaryKey=true)]publicstringCustomerID{get;set;}[Column(Name=ContactName)]publicstringName{get;set;}[Column]publicstringCity{get;set;}}二.DataContext---使用定义好的类与数据库进行交互usingSystem.Data.Linq;DataContextctx=newDataContext(server=.;database=Northwind;integratedsecurity=sspi);TableCustomerCustomers=ctx.GetTableCustomer();GridView1.DataSource=fromcinCustomerswherec.CustomerID.StartsWith(A)selectnew{顾客ID=c.CustomerID,顾客名=c.Name,城市=c.City};GridView1.DataBind();通过GetTable获取表示底层数据表的Table类型,显然,数据库中的Customers表的实体是Customer类型。随后的查询句法,即使你不懂SQL应该也能看明白。从Customers表中找出CustomerID以“A”开头的记录,并把CustomersID、Name以及City封装成新的匿名类型进行返回。二.DataContext---日志功能usingSystem.IO;NorthwindDataContextctx=newNorthwindDataContext(server=xxx;database=Northwind;uid=xxx;pwd=xxx);StreamWritersw=newStreamWriter(Server.MapPath(“log.txt”),true);//追加ctx.Log=sw;GridView1.DataSource=fromcinctx.Customerswherec.CustomerID.StartsWith(A)selectnew{顾客ID=c.CustomerID,顾客名=c.Name,城市=c.City};GridView1.DataBind();sw.Close();运行程序后在网站所在目录生成了log.txt,每次查询都会把诸如下面的日志追加到文本文件中:SELECT[t0].[CustomerID],[t0].[ContactName],[t0].[City]FROM[Customers]AS[t0]WHERE[t0].[CustomerID]LIKE@p0--@p0:InputString(Size=2;Prec=0;Scale=0)[A%]--Context:SqlProvider(Sql2005)Model:AttributedMetaModelBuild:3.5.20706.1应该说这样的日志对于调试程序是非常有帮助的。二.DataContext---执行SQL语句NorthwindDataContextctx=newNorthwindDataContext(server=xxx;database=Northwind;uid=xxx;pwd=xxx);stringnewcity=Shanghai;ctx.ExecuteCommand(updateCustomerssetCity={0}whereCustomerIDlike'A%',newcity);IEnumerableCustomercustomers=ctx.ExecuteQueryCustomer(select*fromCustomerswhereCustomerIDlike'A%');GridView1.DataSource=customers;GridView1.DataBind();虽然Linqtosql能实现90%以上的TSQL功能。但是不可否认,对于复杂的查询,使用TSQL能获得更好的效率。因此,DataContext类型也提供了执行SQL语句的能力。二.DataContext---执行SQL语句使用DbDataReader数据源usingSystem.Data.SqlClient;varconn=newSqlConnection(server=xxx;database=Northwind;uid=xxx;pwd=xxx);varctx=newDataContext(conn);varcmd=newSqlCommand(select*fromcustomerswhereCustomerIDlike'A%',conn);conn.Open();varreader=cmd.ExecuteReader();GridView1.DataSource=ctx.TranslateCustomer(reader);GridView1.DataBind();conn.Close();三.LINQ查询篇查询原理Where操作Select/Distinct操作符三.LINQ查询篇---where作用:起到过滤的作用分类共计3种简单形式关系条件形式First()形式三.LINQ查询篇---where(简单形式)简单形式例如:使用where筛选在伦敦的客户varq=fromcindb.Customerswherec.City==Londonselectc;再如:筛选1994年或之后雇用的雇员:varq=fromeindb.Employeeswheree.HireDate=newDateTime(1994,1,1)selecte;三.LINQ查询篇---where(关系条件形式)关系条件形式筛选库存量在订货点水平之下但未断货的产品:varq=frompindb.Productswherep.UnitsInStock=p.ReorderLevel&&!p.Discontinuedselectp;筛选出UnitPrice大于10或已停产的产品:varq=frompindb.Productswherep.UnitPrice10m||p.Discontinuedselectp;下面这个例子是调用两次where以筛选出UnitPrice大于10且已停产的产品。varq=db.Products.Where(p=p.UnitPrice10m).Where(p=p.Discontinued);三.LINQ查询篇---where(First()形式)First()形式返回集合中的一个元素,其实质就是在SQL语句中加TOP(1)。简单用法:选择表中的第一个发货方。Shippershipper=db.Shippers.First();元素:选择CustomerID为“BONAP”的单个客户Customercust=db.Customers.First(c=c.CustomerID==BONAP);条件:选择运费大于10.00的订单:Orderord=db.Orders.First(o=o.Freight10.00M);三.LINQ查询篇---Select/Distinct操作符(简单形式)说明:和SQL命令中的select作用相似但位置不同,查询表达式中的select及所接子句是放在表达式最后并把子句中的变量也就是结果返回回来;延迟。Select/Distinct操作包括9种形式,分别为简单用法、匿名类型形式、条件形式、指定类型形式、筛选形式、整形类型形式、嵌