ImageVerifierCode 换一换
格式:DOCX , 页数:105 ,大小:419.23KB ,
资源ID:30387547      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/30387547.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(LINQ中文教程.docx)为本站会员(b****8)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

LINQ中文教程.docx

1、LINQ中文教程LINQ中文教程目 录1 初体验之LINQ to Object - 1 -2 一步一步学Linq to sql - 4 -2.1 预备知识 - 4 -2.1.1 隐含类型局部变量 - 4 -2.1.2 匿名类型 - 4 -2.1.3 扩展方法 - 5 -2.1.4 自动属性 - 6 -2.1.5 对象初始化器 - 6 -2.1.6 集合初始化器 - 7 -2.1.7 Lambda表达式 - 7 -2.1.8 查询句法 - 8 -2.2 DataContext与实体 - 9 -2.2.1 定义实体类 - 10 -2.2.2 强类型DataContext - 11 -2.2.3 日

2、志功能 - 12 -2.2.4 探究查询 - 12 -2.2.5 执行查询 - 13 -2.2.6 创建数据库 - 14 -2.2.7 使用DbDataReader数据源 - 15 -2.3 增删改 - 16 -2.3.1 示例数据库 - 16 -2.3.2 生成实体类 - 16 -2.3.3 简易留言簿 - 17 -2.4 查询句法 - 24 -2.4.1 select - 24 -2.4.2 where - 27 -2.4.3 orderby - 28 -2.4.4 分页 - 29 -2.4.5 分组 - 30 -2.4.6 distinct - 32 -2.4.7 union - 33

3、-2.4.8 concat - 34 -2.4.9 取相交项 - 35 -2.4.10 排除相交项 - 36 -2.4.11 子查询 - 37 -2.4.12 in操作 - 38 -2.4.13 join - 39 -2.5 储过程 - 40 -2.5.1 普通存储过程 - 40 -2.5.2 带参数的存储过程 - 42 -2.5.3 带返回值的存储过程 - 43 -2.5.4 多结果集的存储过程 - 44 -2.5.5 使用存储过程新增数据 - 45 -2.5.6 使用存储过程删除数据 - 47 -2.5.7 使用存储过程更改数据 - 48 -2.6 探究特性 - 50 -2.6.1 延迟执

4、行 - 50 -2.6.2 主键缓存 - 57 -2.6.3 DataContext隔离 - 58 -2.7 并发与事务 - 59 -2.7.1 检测并发 - 59 -2.7.2 解决并发 - 60 -2.7.3 事务处理 - 64 -2.8 继承与关系 - 66 -2.8.1 论坛表结构 - 66 -2.8.2 实体继承的定义 - 67 -2.8.3 实体继承的使用 - 69 -2.8.4 实体关系的定义 - 71 -2.8.5 实体关系的使用 - 73 -2.9 其它补充 - 77 -2.9.1 外部映射文件 - 77 -2.9.2 处理空值 - 77 -2.9.3 已编译查询 - 78

5、-2.9.4 撤销提交 - 79 -2.9.5 批量操作 - 80 -2.10 分层构架的例子 - 80 -2.10.1 项目介绍 - 80 -2.10.2 生成映射文件和实体 - 81 -2.10.3 编写数据访问服务 - 81 -2.10.4 WCF服务端与客户端 - 84 -2.10.5 调用服务 - 86 -3 学习Linq To Xml - 89 -3.1 概述 - 89 -3.1.1 直接使用XML元素 - 90 -3.1.2 命名空间 - 91 -3.2 编程概述 - 92 -3.2.1 类概述 - 92 -3.2.2 XDocument 类概述 - 94 -3.2.3 XEle

6、ment 类概述 - 96 -3.3 Linq操作XML - 98 -3.3.1 编程创建XML文档 - 98 -3.3.2 查询创建XML文档 - 99 -3.3.3 加载和解析XML内容 - 100 -3.3.4 遍历内存中的XML文档 - 100 -3.3.5 修改 XML文档 - 102 -1 初体验之LINQ to ObjectVS2008的发布,最激动人心的莫过是LINQ的诞生。Whats LINQ? Language Integrated Query 是也。说得再明白一些,这是编程语言的一种新特性,能够将数据查询语句集成到编程语言中。目前,支持LINQ的语言有C# 和 VB。为啥

7、会有LINQ,主要还是因为现在的数据格式越来越多,数据库、XML、数组、哈希表每一种都有自己操作数据的方式,学起来费事费力。于是,就有了LINQ诞生的理由以一种统一的方式操作各种数据源,减少数据访问的复杂性。LINQ带来很多开发上的便利。首先,他可以利用Visual Studio这个强大的IDE(这话决不是吹,Visual Studio绝对是最好用的开发工具之一),至少用Visual Studio来写SQL语句,可以有智能感知了,比起从前用查询分析器写存储过程的感觉好多了!其次,它可以把数据当成一个对象来操作,即 Data = Object? 的问题。LINQ目前可以对XML, Object,

8、 SQL做数据访问,今后还会有LINQ to Entity的功能。说来惭愧,我也是刚刚才接触LINQ,先从最简单的开始吧,做一个LINQ to Object的例子,实现一个对数组的操作。这个例子套用了今年TechED中海洋兄讲的例子,在此声明。在这个例子中,我会先通过GetMethods的方法,拿到string的所有方法,接下来,就看LINQ的厉害了,这里是选出所有非静态的方法签名。 MethodInfomethods=typeof(string).GetMethods();varresult=fromminmethodswherem.IsStatic!=trueselectm.Name;fo

9、reach(varrinresult)Console.WriteLine(r.ToString();Console.ReadLine();例子虽然简单,确能从中看出LINQ的一些端倪。首先,var是什么东东?看起来,有点像javascript里面的弱类型的变量声明。但是,C#是强类型的,尽管你用var来声明,编译器还是可以根据上下文推倒出它当前的类型。比如这个例子里面,result就是IEnumerable 类型的。在这里面,写IEnumerable和写var是一样效果的,显然,var会简单得多。你不用考虑数据操作的返回值是什么类型,还能享受强类型声明带来的方便实惠还有from m in me

10、thods这句,m是什么东西,m是隐式声明的一个变量,尽管没有声明,但编译器根据上下文,推断出它的类型是MethodInfo型的!.NET Framework 3.5的编译器的确是聪明了很多。上面这个例子运行起来的结果中有很多重复的记录,我们可以用distinct()来过滤掉重复的,和SQL还是很相似的说。 varresult=(fromminmethodswherem.IsStatic!=trueselectm.Name).Distinct();或者用group by 也可以 varresult=fromminmethodswherem.IsStatic!=truegroupmbym.Nam

11、e;但是这样子写,在输出的时候,显示的是 System.Linq.Lookup2 + GroupingSystem.String,System.Reflection.MethodInfo,所以,再做一些修改varresult=fromminmethodswherem.IsStatic!=truegroupmbym.NameintogselectnewMethodName=g.Key,Overload=g.Count();这里面又有一些新鲜的了select new MethodName = g.Key, Overload = g.Count() ,先来看一个简单一些的例子: classMyCla

12、sspublicstringMethodNameget;set;publicintOverloadget;set;classProgramMyClassmc=newMyClassMethodName=aaa,Overload=2;大括号里面的叫类初始化器,省去了构造函数,在new的同时,给对象的属性赋值。这时候再回来看看select new MethodName = g.Key, Overload = g.Count() ,跟这个类初始化器很像吧,但是它更偷懒,new一个新对象,居然连类名都不写。没错,这就叫匿名类。不用写类的声明,直接实例化。类的名字是由编译器在编译的时候自动生成的,也就是说

13、,你在new的时候根本不知道这个类叫啥名,因此,这里就只能用var了。这就更看出var的厉害了,不仅仅是写起来方便这么简单,在用到匿名类的时候,没有类名,这时候只能用var,嘿嘿!2 一步一步学Linq to sql2007-08-24 作者:lovecherry 出处:天极网2.1 预备知识什么是Linq to sql?Linq to sql(或者叫DLINQ)是LINQ(.NET语言集成查询)的一部分,全称基于关系数据的 .NET 语言集成查询,用于以对象形式管理关系数据,并提供了丰富的查询功能,它和Linq to xml、Linq to objects、Linq to dataset、L

14、inq to entities等组成了强大的LINQ。要学好LINQ查询语法,就不得不先理解C# 3.0的一些新特性,下面一一简单介绍。2.1.1 隐含类型局部变量 varage=26;varusername=zhuye;varuserlist=newa,b,c;foreach(varuserinuserlist)Console.WriteLine(user);纯粹给懒人用的var关键字,告诉编译器(对于CLR来说,它是不会知道你是否使用了var,苦力是编译器出的),你自己推断它的类型吧,我不管了。但是既然让编译器推断类型就必须声明的时候赋值,而且不能是null值。注意,这只能用于局部变量,用

15、于字段是不可以的。2.1.2 匿名类型vardata=newusername=zhuye,age=26;Console.WriteLine(username:0age:1,data.username,data.age);匿名类型允许开发人员定义行内类型,无须显式定义类型。常和var配合使用,var用于声明匿名类型。定义一个临时的匿名类型在LINQ查询句法中非常常见,我们可以很方便的实现对象的转换和投影。2.1.3 扩展方法publicstaticclasshelperpublicstaticstringMD5Hash(thisstrings)returnSystem.Web.Security.

16、FormsAuthentication.HashPasswordForStoringInConfigFile(s,MD5);publicstaticboolIn(thisobjecto,IEnumerableb)foreach(objectobjinb)if(obj=o)returntrue;returnfalse;/调用扩展方法Console.WriteLine(123456.MD5Hash();Console.WriteLine(1.In(new1,2,3);很多时候我们需要对CLR类型进行一些操作,苦于无法扩展CLR类型的方法,只能创建一些helper方法,或者生成子类。扩展方法使得这些

17、需求得以实现,同时也是实现LINQ的基础。定义扩展方法需要注意,只能在静态类中定义并且是静态方法,如果扩展方法名和原有方法名发生冲突,那么扩展方法将失效。2.1.4 自动属性publicclassPersonpublicstringusernameget;protectedset;publicintageget;set;publicPerson()this.username=zhuye;Personp=newPerson();/p.username=aa;Console.WriteLine(p.username);意义不是很大,纯粹解决机械劳动。编译器自动为你生成get、set操作以及字段,并

18、且你不能使用字段也不能自定义get、set操作,不过你可以分别定义get和set的访问级别。2.1.5 对象初始化器publicclassPersonpublicstringusernameget;set;publicintageget;set;publicoverridestringToString()returnstring.Format(username:0age:1,this.username,this.age);Personp=newPerson()username=zhuye,age=26;Console.WriteLine(p.ToString();编译器会自动为你做setter

19、操作,使得原本几行的属性赋值操作能在一行中完成。这里需要注意: 允许只给一部分属性赋值,包括internal访问级别 可以结合构造函数一起使用,并且构造函数初始化先于对象初始化器执行2.1.6 集合初始化器publicclassPersonpublicstringusernameget;set;publicintageget;set;publicoverridestringToString()returnstring.Format(username:0age:1,this.username,this.age);varpersons=newListnewPersonusername=a,age=

20、1,newPersonusername=b,age=2;foreach(varpinpersons)Console.WriteLine(p.ToString();编译器会自动为你做集合插入操作。如果你为Hashtable初始化的话就相当于使用了两个对象初始化器。2.1.7 Lambda表达式varlist=newaa,bb,ac;varresult=Array.FindAll(list,s=(s.IndexOf(a)-1);foreach(varvinresult)Console.WriteLine(v);其实和2.0中的匿名方法差不多,都是用于产生内联方法,只不过Lambda表达式的语法更为

21、简洁。语法如下: (参数列表) = 表达式或者语句块 其中: 参数个数:可以有多个参数,一个参数,或者无参数。 表达式或者语句块:这部分就是我们平常写函数的实现部分(函数体)。前面的示例分别是1个参数的例子,下面结合扩展方法来一个复杂的例子: publicdelegateintmydg(inta,intb);publicstaticclassLambdaTestpublicstaticintoper(thisinta,intb,mydgdg)returndg(a,b);Console.WriteLine(1.oper(2,(a,b)=a+b);Console.WriteLine(2.oper(

22、1,(a,b)=a-b);2.1.8 查询句法varpersons=newListnewPersonusername=a,age=19,newPersonusername=b,age=20,newPersonusername=a,age=21,;varselectperson=frompinpersonswherep.age=20selectp.username.ToUpper();foreach(varpinselectperson)Console.WriteLine(p);查询句法是使用标准的LINQ查询运算符来表达查询时一个方便的声明式简化写法。该句法能在代码里表达查询时增进可读性和简洁

23、性,读起来容易,也容易让人写对。Visual Studio 对查询句法提供了完整的智能感应和编译时检查支持。编译器在底层把查询句法的表达式翻译成明确的方法调用代码,代码通过新的扩展方法和Lambda表达式语言特性来实现。上面的查询句法等价于下面的代码:varselectperson=persons.Where(p=p.age=20).Select(p=p.username.ToUpper();LINQ查询句法可以实现90%以上T-SQL的功能(由于T-SQL是基于二维表的,所以LINQ的查询语法会比T-SQL更简单和灵活),但是由于智能感应的原因,select不能放在一开始就输入。2.2 Da

24、taContext与实体DataContext类型(数据上下文)是System.Data.Linq命名空间下的重要类型,用于把查询句法翻译成SQL语句,以及把数据从数据库返回给调用方和把实体的修改写入数据库。DataContext提供了以下一些使用的功能: 以日志形式记录DataContext生成的SQL 执行SQL(包括查询和更新语句) 创建和删除数据库DataContext是实体和数据库之间的桥梁,那么首先我们需要定义映射到数据表的实体。2.2.1 定义实体类usingSystem.Data.Linq.Mapping;Table(Name=Customers)publicclassCust

25、omerColumn(IsPrimaryKey=true)publicstringCustomerIDget;set;Column(Name=ContactName)publicstringNameget;set;ColumnpublicstringCityget;set;以Northwind数据库为例,上述Customers类被映射成一个表,对应数据库中的 Customers表。然后在类型中定义了三个属性,对应表中的三个字段。其中,CustomerID字段是主键,如果没有指定Column特性的Name属性,那么系统会把属性名作为数据表的字段名,也就是说实体类的属性名就需要和数据表中的字段名一

26、致。现在,创建一个ASP.NET页面,然后在页面上加入一个GridView控件,使用下面的代码进行绑定数据: usingSystem.Data.Linq;DataContextctx=newDataContext(server=xxx;database=Northwind;uid=xxx;pwd=xxx);TableCustomers=ctx.GetTable();GridView1.DataSource=fromcinCustomerswherec.CustomerID.StartsWith(A)selectnew顾客ID=c.CustomerID,顾客名=c.Name,城市=c.City;

27、GridView1.DataBind();使用DataContext类型把实体类和数据库中的数据进行关联。你可以直接在DataContext的构造方法中定义连接字符串,也可以使用IDbConnection: usingSystem.Data.SqlClient;IDbConnectionconn=newSqlConnection(server=xxx;database=Northwind;uid=xxx;pwd=xxx);DataContextctx=newDataContext(conn);之后,通过GetTable获取表示底层数据表的Table类型,显然,数据库中的Customers表的实

28、体是Customer类型。随后的查询句法,即使你不懂SQL应该也能看明白。从Customers表中找出CustomerID以“A”开头的记录,并把CustomersID、Name以及City封装成新的匿名类型进行返回。结果如下图:2.2.2 强类型DataContextpublicpartialclassNorthwindDataContext:DataContextpublicTableCustomers;publicNorthwindDataContext(IDbConnectionconnection):base(connection)publicNorthwindDataContext(stringconnection):base(connection)强类型数据上下文使代码更简洁: NorthwindDataContextctx=newNorthwindDataContext(server=xxx;database=Northwind;uid=xxx;pwd=xxx);GridView1.DataSource=fromcinctx.Customerswherec.CustomerID.StartsWith(A)selectnew顾客ID=c.CustomerID,顾客名=c.Name,城市=c.City;GridV

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1