




已阅读5页,还剩90页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
LINQ初体验之LINQ to Object1一步一步学Linq to sql(一):预备知识4一步一步学Linq to sql(二):DataContext与实体9一步一步学Linq to sql(三):增删改15一步一步学Linq to sql(四):查询句法21一步一步学Linq to sql(五):存储过程35一步一步学Linq to sql(六):探究特性46一步一步学Linq to sql(七):并发与事务53一步一步学Linq to sql(八):继承与关系60一步一步学Linq to sql(九):其它补充69一步一步学Linq to sql(十):分层构架的例子73Linq To Xml学习80Linq To Xml学习 1. 概述80Linq To Xml学习 2 编程概述82C# 2008 学习笔记 - LINQ to XML87一、命名空间87二、编程方式创建XML文档88三、使用 LINQ 查询创建XML文档89四、加载和解析XML内容90六、遍历内存中的XML文档90七、修改 XML文档92使用linq to xml 快速创建自己的Rss93LINQ初体验之LINQ to ObjectVS2008的发布,最激动人心的不过是LINQ的诞生。Whats LINQ? Language Integrated Query 是也。说得再明白一些,这是编程语言的一种新特性,能够将数据查询语句集成到编程语言中。目前,LINQ支持的语言有C# 和 VB。为啥会有LINQ,主要还是因为现在的数据格式越来越多,数据库、XML、数组、哈希表每一种都有自己操作数据的方式,学起来费事费力。于是,就有了LINQ诞生的理由以一种统一的方式操作各种数据源,减少数据访问的复杂性。LINQ带来很多开发上的便利。首先,他可以利用Visual Studio这个强大的IDE(这话决不是吹,Visual Studio绝对是最好用的开发工具之一),至少用Visual Studio来写SQL语句,可以有智能感知了,比起从前用查询分析器写存储过程的感觉好多了!其次,它可以把数据当成一个对象来操作,即 Data = Object? 的问题。LINQ目前可以对XML, Object, SQL做数据访问,今后还会有LINQ to Entity的功能。说来惭愧,我也是刚刚才接触LINQ,先从最简单的开始吧,做一个LINQ to Object的例子,实现一个对数组的操作。这个例子套用了今年TechED中海洋兄讲的例子,在此声明。在这个例子中,我会先通过GetMethods的方法,拿到string的所有方法,接下来,就看LINQ的厉害了,这里是选出所有非静态的方法签名。 MethodInfomethods=typeof(string).GetMethods(); varresult=fromminmethods wherem.IsStatic!=true selectm.Name; foreach(varrinresult) Console.WriteLine(r.ToString(); Console.ReadLine();例子虽然简单,确能从中看出LINQ的一些端倪。首先,var是什么东东?看起来,有点像javascript里面的弱类型的变量声明。但是,C#是强类型的,尽管你用var来声明,编译器还是可以根据上下文推倒出它当前的类型。比如这个例子里面,result就是IEnumerable 类型的。在这里面,写IEnumerable和写var是一样效果的,显然,var会简单得多。你不用考虑数据操作的返回值是什么类型,还能享受强类型声明带来的方便实惠还有from m in methods这句,m是什么东西,m是隐式声明的一个变量,尽管没有声明,但编译器根据上下文,推断出它的类型是MethodInfo型的!.NET Framework 3.5的编译器的确是聪明了很多 上面这个例子运行起来的结果中有很多重复的记录,我们可以用distinct()来过滤掉重复的,和SQL还是很相似的说。 varresult=(fromminmethods wherem.IsStatic!=true selectm.Name).Distinct();或者用group by 也可以 varresult=fromminmethods wherem.IsStatic!=true groupmbym.Name;但是这样子写,在输出的时候,显示的是 System.Linq.Lookup2+GroupingSystem.String,System.Reflection.MethodInfo,所以,再做一些修改 varresult=fromminmethods wherem.IsStatic!=true groupmbym.Nameintog selectnewMethodName=g.Key,Overload=g.Count();这里面又有一些新鲜的了select new MethodName = g.Key, Overload = g.Count() ,先来看一个简单一些的例子: classMyClass publicstringMethodNameget;set; publicintOverloadget;set; classProgram MyClassmc=newMyClassMethodName=aaa,Overload=2; 大括号里面的叫类初始化器,省去了构造函数,在new的同时,给对象的属性赋值。这时候再回来看看select new MethodName = g.Key, Overload = g.Count() ,跟这个类初始化器很像吧,但是它更偷懒,new一个新对象,居然连类名都不写。没错,这就叫匿名类。不用写类的声明,直接实例化。类的名字是由编译器在编译的时候自动生成的,也就是说,你在new的时候根本不知道这个类叫啥名,因此,这里就只能用var了。这就更看出var的厉害了,不仅仅是写起来方便这么简单,在用到匿名类的时候,没有类名,这时候只能用var,嘿嘿!一步一步学Linq to sql(一):预备知识2007-08-14 09:00 作者: lovecherry 出处: 天极网 责任编辑:dizzarz什么是Linq to sqlLinq to sql(或者叫DLINQ)是LINQ(.NET语言集成查询)的一部分,全称基于关系数据的 .NET 语言集成查询,用于以对象形式管理关系数据,并提供了丰富的查询功能,它和Linq to xml、Linq to objects、Linq to dataset、Linq to entities等组成了强大的LINQ。要学好LINQ查询语法,就不得不先理解C# 3.0的一些新特性,下面一一简单介绍。隐含类型局部变量 varage=26; varusername=zhuye; varuserlist=newa,b,c; foreach(varuserinuserlist) Console.WriteLine(user);纯粹给懒人用的var关键字,告诉编译器(对于CLR来说,它是不会知道你是否使用了var,苦力是编译器出的),你自己推断它的类型吧,我不管了。但是既然让编译器推断类型就必须声明的时候赋值,而且不能是null值。注意,这只能用于局部变量,用于字段是不可以的。匿名类型 vardata=newusername=zhuye,age=26; Console.WriteLine(username:0age:1,data.username,data.age);匿名类型允许开发人员定义行内类型,无须显式定义类型。常和var配合使用,var用于声明匿名类型。定义一个临时的匿名类型在LINQ查询句法中非常常见,我们可以很方便的实现对象的转换和投影。扩展方法 publicstaticclasshelper publicstaticstringMD5Hash(thisstrings) returnSystem.Web.Security.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方法,或者生成子类。扩展方法使得这些需求得意实现,同时也是实现LINQ的基础。定义扩展方法需要注意,只能在静态类中定义并且是静态方法,如果扩展方法名和原有方法名发生冲突,那么扩展方法将失效。自动属性 publicclassPerson publicstringusernameget;protectedset; publicintageget;set; publicPerson() this.username=zhuye; Personp=newPerson(); /p.username=aa; Console.WriteLine(p.username);意义不是很大,纯粹解决机械劳动。编译器自动为你生成get、set操作以及字段,并且你不能使用字段也不能自定义get、set操作,不过你可以分别定义get和set的访问级别。对象初始化器 publicclassPerson publicstringusernameget;set; publicintageget;set; publicoverridestringToString() returnstring.Format(username:0age:1,this.username,this.age); Personp=newPerson()username=zhuye,age=26; Console.WriteLine(p.ToString();编译器会自动为你做setter操作,使得原本几行的属性赋值操作能在一行中完成。这里需要注意: 允许只给一部分属性赋值,包括internal访问级别 可以结合构造函数一起使用,并且构造函数初始化先于对象初始化器执行集合初始化器 publicclassPerson publicstringusernameget;set; publicintageget;set; publicoverridestringToString() returnstring.Format(username:0age:1,this.username,this.age); varpersons=newList newPersonusername=a,age=1, newPersonusername=b,age=2; foreach(varpinpersons) Console.WriteLine(p.ToString();编译器会自动为你做集合插入操作。如果你为Hashtable初始化的话就相当于使用了两个对象初始化器。Lambda表达式 varlist=newaa,bb,ac; varresult=Array.FindAll(list,s=(s.IndexOf(a)-1); foreach(varvinresult) Console.WriteLine(v);其实和2.0中的匿名方法差不多,都是用于产生内联方法,只不过Lambda表达式的语法更为简洁。语法如下:(参数列表) = 表达式或者语句块其中:参数个数:可以有多个参数,一个参数,或者无参数。表达式或者语句块:这部分就是我们平常写函数的实现部分(函数体)。前面的示例分别是1个参数的例子,下面结合扩展方法来一个复杂的例子: publicdelegateintmydg(inta,intb); publicstaticclassLambdaTest publicstaticintoper(thisinta,intb,mydgdg) returndg(a,b); Console.WriteLine(1.oper(2,(a,b)=a+b); Console.WriteLine(2.oper(1,(a,b)=a-b);查询句法 varpersons=newList newPersonusername=a,age=19, newPersonusername=b,age=20, newPersonusername=a,age=21, ; varselectperson=frompinpersonswherep.age=20selectp.username.ToUpper(); foreach(varpinselectperson) Console.WriteLine(p);查询句法是使用标准的LINQ查询运算符来表达查询时一个方便的声明式简化写法。该句法能在代码里表达查询时增进可读性和简洁性,读起来容易,也容易让人写对。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不能放在一开始就输入。一步一步学Linq to sql(二):DataContext与实体2007-08-24 00:00 作者: LoveCherry 出处: 天极网 责任编辑:dizzarzDataContext DataContext类型(数据上下文)是System.Data.Linq命名空间下的重要类型,用于把查询句法翻译成SQL语句,以及把数据从数据库返回给调用方和把实体的修改写入数据库。 DataContext提供了以下一些使用的功能: 以日志形式记录DataContext生成的SQL 执行SQL(包括查询和更新语句) 创建和删除数据库 DataContext是实体和数据库之间的桥梁,那么首先我们需要定义映射到数据表的实体。定义实体类usingSystem.Data.Linq.Mapping; Table(Name=Customers) publicclassCustomer Column(IsPrimaryKey=true) publicstringCustomerIDget;set; Column(Name=ContactName) publicstringNameget;set; Column publicstringCityget;set; 以Northwind数据库为例,上述Customers类被映射成一个表,对应数据库中的 Customers表。然后在类型中定义了三个属性,对应表中的三个字段。其中,CustomerID字段是主键,如果没有指定Column特性的Name属性,那么系统会把属性名作为数据表的字段名,也就是说实体类的属性名就需要和数据表中的字段名一致。 现在,创建一个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; GridView1.DataBind(); 使用DataContext类型把实体类和数据库中的数据进行关联。你可以直接在DataContext的构造方法中定义连接字符串,也可以使用IDbConnection: usingSystem.Data.SqlClient; IDbConnectionconn=newSqlConnection(server=xxx;database=Northwind;uid=xxx;pwd=xxx); DataContextctx=newDataContext(conn); 之后,通过GetTable获取表示底层数据表的Table类型,显然,数据库中的Customers表的实体是Customer类型。随后的查询句法,即使你不懂SQL应该也能看明白。从Customers表中找出CustomerID以“A”开头的记录,并把CustomersID、Name以及City封装成新的匿名类型进行返回。 结果如下图:强类型DataContextpublicpartialclassNorthwindDataContext:DataContext publicTableCustomers; 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; GridView1.DataBind(); DataContext其实封装了很多实用的功能,下面一一介绍。日志功能usingSystem.IO; NorthwindDataContextctx=newNorthwindDataContext(server=xxx;database=Northwind;uid=xxx;pwd=xxx); StreamWritersw=newStreamWriter(Server.MapPath(log.txt),true);/Append ctx.Log=sw; GridView1.DataSource=fromcinctx.Customerswherec.CustomerID.StartsWith(A)selectnew顾客ID=c.CustomerID,顾客名=c.Name,城市=c.City; GridView1.DataBind(); sw.Close(); 运行程序后在网站所在目录生成了log.txt,每次查询都会把诸如下面的日志追加到文本文件中: SELECTt0.CustomerID,t0.ContactName,t0.City FROMCustomersASt0 WHEREt0.CustomerIDLIKEp0 -p0:InputString(Size=2;Prec=0;Scale=0)A% -Context:SqlProvider(Sql2005)Model:AttributedMetaModelBuild:3.5.20706.1 应该说这样的日志对于调试程序是非常有帮助的。探究查询usingSystem.Data.Common; usingSystem.Collections.Generic; NorthwindDataContextctx=newNorthwindDataContext(server=xxx;database=Northwind;uid=xxx;pwd=xxx); varselect=fromcinctx.Customerswherec.CustomerID.StartsWith(A)selectnew顾客ID=c.CustomerID,顾客名=c.Name,城市=c.City; DbCommandcmd=ctx.GetCommand(select); Response.Write(cmd.CommandText+); foreach(DbParameterparmincmd.Parameters) Response.Write(string.Format(参数名:0,参数值:1,parm.ParameterName,parm.Value); Customercustomer=ctx.Customers.First(); customer.Name=zhuye; IListqueryText=ctx.GetChangeSet().ModifiedEntities; Response.Write(Customer)queryText0).Name); 在这里,我们通过DataContext的GetCommand方法获取了查询对应的DbCommand,并且输出了CommandText和所有的DbParameter。之后,我们又通过GetChangeSet方法获取了修改后的实体,并输出了修改内容。执行查询NorthwindDataContextctx=newNorthwindDataContext(server=xxx;database=Northwind;uid=xxx;pwd=xxx); stringnewcity=Shanghai; ctx.ExecuteCommand(updateCustomerssetCity=0whereCustomerIDlikeA%,newcity); IEnumerablecustomers=ctx.ExecuteQuery(select*fromCustomerswhereCustomerIDlikeA%); GridView1.DataSource=customers; GridView1.DataBind(); 前一篇文章已经说了,虽然Linq to sql能实现90以上的TSQL功能。但是不可否认,对于复杂的查询,使用TSQL能获得更好的效率。因此,DataContext类型也提供了执行SQL语句的能力。代码的执行结果如下图:创建数据库testContextctx=newtestContext(server=xxx;database=testdb;uid=xxx;pwd=xxx); ctx.CreateDatabase(); Table(Name=test) publicclasstest Column(IsPrimaryKey=true,IsDbGenerated=true) publicintIDget;set; Column(DbType=varchar(20) publicstringNameget;set; publicpartialclasstestContext:DataContext publicTabletest; publictestContext(stringconnection):base(connection) testContext ctx = new testContext(server=xxx;database=testdb;uid=xxx;pwd=xxx);ctx.CreateDatabase();Table(Name = test)public class test Column(IsPrimaryKey = true, IsDbGenerated = true) public int ID get; set; Column(DbType=varchar(20) public string Name get; set; public partial class testContext : DataContext public Table test; public testContext(string connection) : base(connection) 这段代码在数据库中创建了名为testdb的数据库,等同于下面的脚本:CREATETABLEdbo.test( IDintIDENTITY(1,1)NOTNULL, Namevarchar(20)COLLATEChinese_PRC_CI_ASNULL, CONSTRAINTPK_testPRIMARYKEYCLUSTERED ( IDASC )WITH(IGNORE_DUP_KEY=OFF)ONPRIMARY )ONPRIMARY 同时,DataContext还提供了DeleteDatabase()方法,在这里就不列举了。使用DbDataReader数据源usingSystem.Data.SqlClient; varconn=newSqlConnection(server=xxx;database=Northwind;uid=xxx;pwd=xxx); varctx=newDataContext(conn); varcmd=newSqlCommand(select*fromcustomerswhereCustomerIDlikeA%,conn); conn.Open(); varreader=cmd.ExecuteReader(); GridView1.DataSource=ctx.Translate(reader); GridView1.DataBind(); conn.Close(); 你同样可以选择使用DataReader获取数据,增加了灵活性的同时也增加了性能。看到这里,你可能会觉得手工定义和数据库中表对应的实体类很麻烦,不用担心,VS2008提供了自动生成实体类以及关系的工具,工具的使用将在以后讲解。今天就讲到这里,和DataContext相关的事务、加载选项、并发选项以及关系实体等高级内容也将在以后讲解。一步一步学Linq to sql(三):增删改2007-10-20 00:00 作者: lovecherry 出处: 天极网 责任编辑:dizzarz 示例数据库字段名字段类型允许空字段说明IDuniqueidentifier表主键字段UserNamevarchar(50)留言用户名PostTimedatetime留言时间Messagevarchar(400)留言内容IsRepliedbit留言是否回复Replyvarchar(400)留言管理员回复 在数据库中创建一个名为GuestBook的数据库,在里面创建一个tbGuestBook的表,结构如上表。生成实体类 右键点击网站项目,选择添加新项,然后选择“Linq to sql Classes”,命名为GuestBook。然后打开App_Code里面的GuestBook.dbml。设计视图上的文字提示你可以从服务器资源管理器或者攻击箱拖动项到设计界面上来创建实体类。 那么,我们就在服务器资源管理器中创建一个指向GuestBook数据库的数据连接,然后把tbGuestBook表拖动到GuestBook.dbml的设计视图上,按CTRL+S保存。打开GuestBook.designer.cs可以发现系统自动创建了GuestBook数据库中tbGuestBook表的映射,如下图:简易留言簿 现在,我们就可以使用Linq to sql完成简易留言簿了。实现以下功能: 发表留言(增) 查看留言(查) 管理员回复留言(改) 管理员删除留言(删除)首先,创建一个Default.aspx,在页面上加入一些控件: 姓名 留言 - 管理员回复: 你可能很难想象,使用Linqtosql进行数据访问会是这么简单,后台代码: publicpartialclass_Default:System.Web.UI.Page GuestBookDataContextctx=newGuestBookDataContext(server=xxx;database=GuestBook;uid=xxx;pwd=xxx); protectedvoidPage_Load(objectsender,EventArgse) if(!IsPostBack) SetBind(); protectedvoidbtn_SendMessage_Click(objectsender,EventArgse) tbGuestBookgb=newtbGuestBook(); gb.ID=Guid.NewGuid(); gb.UserName=tb_UserName.Text; gb.Message=tb_Message.Text; gb.IsReplied=false; gb.PostTime=DateTime.Now; ctx.tbGuestBooks.Add(gb); ctx.SubmitChanges(); SetBind(); privatevoidSetBind() rpt_Message.DataSource=fromgbinctx.tbGuestBooksorderbygb.PostTimedescendingselectgb; rpt_Message.DataBind(); 前面创建Linq to sql Classes的时候我们输入名字GuestBook,系统就为我们自动创建了GuestBookDataContext(你也可以在GuestBook.Designer.cs中找到类定义)。在绑定的时候我们使用查询句法查询留言表中所有留言,按照发表时间倒序(天哪?这是数据访问吗?好像仅仅定义了一句SQL啊)。在发表留言按钮中,我们为一个tbGuestBook赋值,然后把它加入留言表,再提交更改,就这样完成了记录的插入。 运行效果如下图: 然后,再创建一个Admin.aspx,前台代码如下: - asp:ButtonID=btn_DeleteMessagerunat=serverText=删除留言CommandName=DeleteMessageCommandArgument=/ 管理员回复:asp:TextBoxrunat=ser
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 西藏流散僧尼管理办法
- 企业环境安全培训计划课件
- 企业火灾安全培训课件
- 纪委规范案件管理办法
- 2025年国家工作人员学法用法考试题库附参考答案
- 中级消防设施操作员试题考试题库含答案
- 出租屋安全培训方案课件
- 企业安全巡查培训内容课件
- 新媒体环境下的文化传播转型-洞察及研究
- 企业安全学习培训总结课件
- 动漫欣赏课课件-低年级
- 短视频手机拍摄与剪辑
- 完整版韦氏成人智力测试完整版
- 普通话课件(完整版)
- 计量检定(校准)管理规程
- 急诊医学概论培训课件
- 2023北京市高级中等学校招生考试英语答题卡A4版word版可以编辑
- 2022年广州白云区辅警考试真题
- 《草帽是父亲的徽饰》阅读练习
- 《思想政治教育方法论》PPT课件-2.第八章-课件-第八章《思想政治教育的一般方法》201812
- 输变电工程钢管杆吊装组立工程施工方案和措施方案
评论
0/150
提交评论