第13章 LINQ数据操作技术_第1页
第13章 LINQ数据操作技术_第2页
第13章 LINQ数据操作技术_第3页
第13章 LINQ数据操作技术_第4页
第13章 LINQ数据操作技术_第5页
已阅读5页,还剩44页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

本章要求:第13章LINQ数据操作技术LINQ技术的组成架构常用的LINQ查询子句及使用如何创建LINQ数据源使用LINQ技术对数据库执行增、删、改、查操作如何使用LinqDataSource控件使用LINQ技术操作数组和集合使用LINQ技术操作DataSet数据集使用LINQ技术操作XML文件使用LINQ技术实现数据分页功能使用LINQ技术防止SQL注入式攻击主要内容1.LINQ技术概述2.LINQ查询常用子句3.使用LINQ操作SQLServer数据库4.使用LINQ操作其他数据5.综合实例——使用LINQ实现数据分页第13章LINQ数据操作技术13.1LINQ技术概述LINQ是.NETFramework中一项突破性的创新,它在对象领域和数据领域之间架起了一座桥梁。LINQ主要由3部分组成,分别为LINQtoObjects、LINQtoADO.NET和LINQtoXML。其中,LINQtoADO.NET可以分为两部分,分别为LINQtoSQL和LINQtoDataSet。LINQ的组成说明如下:LINQtoSQL组件:可以查询基于关系数据库的数据,并对这些数据进行检索、插入、修改、删除、排序、聚合和分区等操作。LINQtoDataSet组件:可以查询DataSet对象中的数据,并对这些数据进行检索、过滤和排序等操作。LINQtoObjects组件:可以查询Ienumerable或Ienumerable<T>集合,也就是说可以查询任何可枚举的集合,如数据(Array和ArrayList)、泛型列表List<T>、泛型字典Dictionary<T>以及用户自定义的集合,而不需要使用LINQ提供程序或API。LINQtoXML组件:可以查询或操作XML结构的数据(如XML文档、XML片段和XML格式的字符串等),并提供了修改文档对象模型的内存文档和支持LINQ查询表达式等功能,处理XML文档的全新编程接口。

LINQ可以查询或操作任何存储形式的数,如对象(集合、数组、字符串等)、关系(关系数据库、ADO.NET数据集等)以及XML。LINQ架构如图13-1所示。图13-1LINQ架构13.2.1from子句13.2.2where子句13.2.3select子句13.2.4orderby子句13.2LINQ查询常用子句LINQ查询表达式必须包括from子句,且以from子句开头。from子句指定查询操作的数据源和范围变量。其中,数据源不但包括查询本身的数据源,而且还包括子查询的数据源。范围变量一般用来表示源序列中的每一个元素。说明:

如果查询表达式还包括子查询,那么子查询表达式也必须以from子句开头。【例13-1】本实例在LINQ查询表达式中使用from子句从int数组中查询能被2整除的元素。代码如下:protectedvoidPage_Load(objectsender,EventArgse){int[]values={1,2,3,4,5,6,7,8,9,0};varvalue=fromvinvalueswherev%2==0selectv;Response.Write("查询结果:<br>");foreach(varvinvalue){Response.Write(v.ToString()+"<br>");}}13.2.1from子句运行程序,效果如图13-2所示。图13-2from子句查询结果在LINQ查询表达式中,where子句指定筛选元素的逻辑条件,一般由逻辑运算符(如逻辑与和逻辑或)组成。一个查询表达式可以不包含where子句,也可以包含一个或多个where子句,每一个where子句可以包含一个或多个布尔条件表达式。注意:

对于一个LINQ查询表达式而言,where子句不是必需的。如果where子句在查询表达式中出现,那么where子句不能作为查询表达式的第一个子句或最后一个子句。【例13-2】本实例在查询表达式中使用where子句,并且where子句由两个布尔表达式和逻辑与&&组成。代码如下:protectedvoidPage_Load(objectsender,EventArgse){int[]values={1,2,3,4,5,6,7,8,9,0};varvalue=fromvinvalueswherev%2==0&&v>2selectv;Response.Write("查询结果:<br>");foreach(varvinvalue){Response.Write(v.ToString()+"<br>");}13.2.2where子句运行程序,效果如图13-3所示。图13-3where子句查询结果13.2.3select子句在LINQ查询表达式中,select子句指定查询结果的类型和表现形式。LINQ查询表达式必须以select子句或group子句结束。【例13-3】本实例演示了包含最简单select子句的查询操作,代码如下:protectedvoidPage_Load(objectsender,EventArgse){int[]values={1,2,3,4,5,6,7,8,9,0};varvalue=fromvinvalueswherev>5selectv;Response.Write("查询结果:<br>");foreach(varvinvalue){Response.Write(v.ToString()+"<br>");}}运行程序,效果如图13-4所示。图13-4select子句查询结13.2.4orderby子句在LINQ查询表达式中,orderby子句可以对查询结果进行排序,排序方式可以为“升序”或“降序”,且排序的主键可以是一个或多个。值得注意的是,LINQ查询表达式对查询结果的默认排序方式为“升序”。说明:

在LINQ查询表达式中,orderby子句升序使用ascending关键字,降序使用descending关键字。【例13-4】本实例演示orderby子句对查询的结果进行排序。本示例实现的是将数据源中的数字按降序排序,然后使用foreach输出查询结果。代码如下:protectedvoidPage_Load(objectsender,EventArgse){int[]values={3,8,6,4,1,5,7,0,9,2};varvalue=fromvinvalueswherev<3||v>7orderbyvdescendingselectv;//输出查询结果Response.Write("查询结果:<br>");foreach(variinvalue){Response.Write(i+"<br>");}}运行程序,效果如图13-5所示。图13-5orderby子句查询结果排序13.3使用LINQ操作SQLServer数据库13.3.1创建LINQ数据源13.3.2使用LINQ执行操作数据库13.3.3灵活运用LinqDataSource控件13.3.1创建LINQ数据源使用LINQ查询或操作数据库,需要建立LINQ数据源,LINQ数据源专门使用DBML文件作为数据源。下面以SQLServer2008数据库为例,建立一个LINQ数据源,详细步骤如下:(1)启动VisualStudio2010开发环境,建立一个目标框架为FrameworkSDKv4.0的ASP.NET空网站。(2)在“解决方案资源管理器”窗口中的App_Code文件夹上右击,在弹出的快捷菜单中选择“添加新项”命令,弹出“添加新项”对话框,如图13-6所示。图13-6添加新项

(3)在图13-6所示的“添加新项”对话框中选择“LINQtoSQL类”,并输入名称,单击“添加”按钮,添加一个LinqToSql类文件。(4)在“服务器资源管理器”窗口中连接SQLServer2008数据库,然后将指定数据库中的表映射到LinqDB.dbml中(可以将表拖拽到设计视图中),如图13-7所示。图13-7数据表映射到dbml文件(5)LinqDB.dbml文件将自动创建一个名称为LinqDBDataContext的数据上下文类,为数据库提供查询或操作数据库的方法,LINQ数据源创建完毕。LinqDBDataContext类中的程序代码均自动生成,如图13-8所示。图13-8LinqDBDataContext类中自动生成程序代码说明:

根据以上操作,在App_Code文件夹下自动生成LinqDB.dbml对应的LinqDB.designer.cs文件。13.3.2使用LINQ执行操作数据库使用LINQ对数据库进行操作,如数据的添加、修改、删除和查询等,这些功能主要通过LINQ技术中的DataContext上下文类来实现。1.查询数据库中的数据使用LINQtoSQL查询数据库中的数据与传统的SQL语句或存储过程相比更加简洁。【例13-5】本实例首先根据13.3.1节的步骤建立LINQ数据源连接数据库,然后通过生成的DataContext数据上下文类访问数据库中的数据,并将数据绑定到GridView控件显示留言信息。实例运行效果如图13-9所示。图13-9LINQ查询数据库中的数据程序开发步骤如下:(1)新建一个网站,默认主页为Default.aspx。(2)根据13.3.1节的步骤建立LINQ数据源。(3)在Default.aspx页面上添加一个GridView控件,用来显示数据库中的数据。(4)在Default.aspx.cs页面的Page_Load事件中,首先声明LinqDBDataContext类的对象lqDB,然后使用LINQ查询表达式查询id大于0的查询结果,并将查询结果保存到result变量中,最后将result变量中存储的结果设置为GridView控件的数据源,并且绑定数据显示查询结果。代码如下:protectedvoidPage_Load(objectsender,EventArgse){LinqDBDataContextlqDB=newLinqDBDataContext(ConfigurationManager.ConnectionStrings["db_ASPNETConnectionString"].ConnectionString.ToString());varresult=fromrinlqDB.Leavewordwherer.id>0selectr;GridView1.DataSource=result;GridView1.DataBind();}

说明:

建立LINQ数据源后,在Web.config文件中可以找到自动生成的连接字符串,如上述代码中的字符串db_ASPNETConnectionString。2.向数据库中添加数据使用LINQtoSQL不仅可以实现查询数据库中的数据,而且还能够实现向数据库中添加数据。实现该功能主要通过Tabel<T>泛型类的InsertOnSubmit方法和DataContext类的SubmitChanges方法,其中,InsertOnSubmit方法将单个实体的集合添加到Tabel<T>类的实例中,SubmitChanges方法计算要插入、更新或删除的已修改对象的集,并执行相应命令以实现对数据库的更改。【例13-6】本实例在留言页面上,输入留言标题、E-mail地址以及留言内容,通过LINQ技术可以将留言信息保存到数据库中。实例运行效果如图13-10所示。图13-10LINQ向数据库中添加数据13.3.3灵活运用LinqDataSource控件LinqDataSource是一个新的数据源绑定控件,通过该控件可以直接插入、更新和删除DataContext实体类下的数据,从而实现操作数据库中数据的功能。说明:

.NET下的所有数据绑定控件都可以通过LinqDataSource控件进行数据绑定。下面介绍如何使用LinqDataSource控件配置数据源,从而通过数据绑定控件来查询或操作数据。【例13-9】本实例在ASP.NET网站中首先建立LINQ数据源,然后使用LinqDataSource控件配置数据源,并作为GridView控件的绑定数据源。实例运行效果如图13-13所示。图13-13使用LinqDataSource控件配置数据源程序开发步骤如下:(1)新建一个网站,默认主页为Default.aspx。(2)根据13.3.1节的步骤建立LINQ数据源。(3)在Default.aspx页面上添加一个LinqDataSource控件,单击该控件右上角的“<”按钮,选择“配置数据源”命令。(4)在打开的“选择上下文对象”界面中,选择步骤(2)中创建的上下文对象,如图13-14所示。图13-14“选择上下文对象”界面(5)单击“下一步”按钮,在“配置数据选择”界面中选择数据表和字段(这里选择“*”),如图13-15所示。图13-15“配置数据选择”界面注意:

在Select列表框中必须选择*,或者选择所有字段,这样才能正常使用LinqDataSource控件,也就是说,不能选择部分字段,否则LinqDataSource控件将不支持自动插入、更新、删除等功能。(6)单击“高级”按钮,在“高级选项”对话框中选中所有选项(如图13-16所示),单击“确定”按钮返回到“配置数据选择”界面。图13-16“高级选项”对话框说明:

在“配置数据选择”界面中单击Where(W)按钮或OrderBy(O)按钮可以自定义查询语句。(7)在“配置数据选择”界面中单击“完成”按钮完成配置数据源。(8)在Default.aspx页面上添加一个GridView控件,设置绑定的数据源为LinqDataSource1即可开发人员可以将LINQ查询结果绑定到DropDownList控件,具体步骤为:首先声明LinqDBDataContext类对象lqDB;然后创建LINQ查询表达式,并将查询结果保存到result变量中;最后将result变量中存储的结果设置为DropDownList控件的数据源,并指定要在DropDownList控件中显示的字段。关键代码如下:LinqDBDataContextlqDB=newLinqDBDataContext(ConfigurationManager.ConnectionStrings["db_CSharpConnectionString"].ConnectionString.ToString());//查询要删除的记录varresult=fromrinlqDB.Leavewordwherer.id>0selectnew { Title=r.Title,};//设置绑定字段DropDownList1.DataTextField="Title";//绑定查询结果DropDownList1.DataSource=result;DropDownList1.DataBind();13.4使用LINQ操作其他数据13.4.1使用LINQ操作数组和集合13.4.2使用LINQ操作DataSet数据集13.4.3使用LINQ操作XML文件13.4.1使用LINQ操作数组和集合对数组和集合进行操作时可以使用LinqToObjects技术,它是一种新的处理集合的方法,如果采用旧方法,程序开发人员必须编写指定如何从集合检索数据的复杂的foreach循环,而采用LinqToObjects技术,只需编写描述要检索的内容的声明性代码。LinqToObjects能够直接使用LINQ查询IEnumerable或IEnumerable<T>集合,而不需要使用LINQ提供程序或API,可以说,使用LINQ能够查询任何可枚举的集合,例如数组、泛型列表等。下面通过一个实例讲解如何使用LINQ技术操作数组和集合。【例13-10】本实例主要演示如何使用LINQ技术从数组中查找及格范围内的分数,并循环访问查询结果及输出。实例运行效果如图13-17所示。图13-17使用LINQ操作数组和集合程序开发步骤如下:(1)新建一个网站,默认主页为Default.aspx。(2)在Default.aspx.cs页面的Page_Load事件中,使用LINQ技术从数组中查找及格范围内的分数,然后循环访问查询结果并输出。代码如下:protectedvoidPage_Load(objectsender,EventArgse){int[]intScores={45,68,80,90,75,76,32}; //定义int类型的一维数组//使用LINQ技术从数组中查找及格范围内的分数varscore=fromhgScroeinintScoreswherehgScroe>=60orderbyhgScroeascendingselecthgScroe;Response.Write("及格的分数:</br>");foreach(varvinscore) //循环访问查询结果并显示{Response.Write(v.ToString()+"</br>");}}13.4.2使用LINQ操作DataSet数据集对DataSet数据集进行操作时可以使用LINQtoDataSet技术,它是LINQtoADO.NET中的独立技术,使用LINQtoDataSet技术查询DataSet对象更加方便快捷,下面对LINQtoDataSet技术中常用到的方法进行详细讲解。(1)AsEnumerable方法AsEnumerable方法可以将DataTable对象转换为EnumerableRowCollection<DataRow>对象,其语法格式如下:publicstaticEnumerableRowCollection<DataRow>AsEnumerable(thisDataTablesource)source:表示可枚举的源DataTable。返回值:一个IEnumerable<T>对象,其泛型参数T为DataRow。(2)CopyToDataTable方法CopyToDataTable方法用来将IEnumerable<T>对象中的数据赋值到DataTable对象中,其语法格式如下:publicstaticDataTableCopyToDataTable<T>(thisIEnumerable<T>source)whereT:DataRowsource:源IEnumerable<T>序列。返回值:一个DataTable,其中包含作为DataRow对象的类型的输入序列。(3)AsDataView方法AsDataView方法用来创建并返回支持LINQ的DataView对象,其语法格式如下:publicstaticDataViewAsDataView<T>(thisEnumerableRowCollection<T>source)whereT:DataRowsource:从中创建支持LINQ的DataView的源LINQtoDataSet查询。返回值:支持LINQ的DataView对象。(4)Take方法Take方法用来从序列的开头返回指定数量的连续元素,其语法格式如下:publicstaticIEnumerable<TSource>Take<TSource>(thisIEnumerable<TSource>source,intcount)source:表示要从其返回元素的序列。count:表示要返回的元素数量。返回值:一个IEnumerable<T>,包含输入序列开头的指定数量的元素。(5)Sum方法Sum方法用来计算数值序列之和,其语法格式如下:publicstaticdecimalSum(thisIEnumerable<decimal>source)source:一个要计算和的Decimal值序列。返回值:序列值之和。说明:

上面介绍的几种方法都有多种重载形式,这里只介绍其常用到的重载形式。

【例13-11】本实例主要演示如何使用LINQ技术获取DataSet数据集中的数据,并绑定在GridView控件中。实例运行效果如图13-18所示。图13-18使用LINQ操作DataSet数据集程序开发步骤如下:(1)新建一个网站,默认主页为Default.aspx。(2)在Default.aspx页面上添加一个GridView控件,并设置其自动套用格式为“蓝黑1”,用来显示DataSet数据集中的数据。(3)在Default.aspx.cs页面的Page_Load事件中,首先将数据库中的数据填充到DataSet数据集中,然后使用LINQ技术从DataSet数据集中查找信息并显示在GridView控件中。代码如下:protectedvoidPage_Load(objectsender,EventArgse){//定义数据库连接字符串stringstrCon="DataSource=MRWXK\\MRWXK;Database=db_ASPNET;Uid=sa;Pwd=;";SqlConnectionsqlcon; //声明SqlConnection对象SqlDataAdaptersqlda; //声明SqlDataAdapter对象DataSetmyds; //声明DataSet数据集对象sqlcon=newSqlConnection(strCon); //创建数据库连接对象//创建数据库桥接器对象sqlda=newSqlDataAdapter("select*fromtb_mrbccd",sqlcon);myds=newDataSet(); //创建数据集对象sqlda.Fill(myds,"tb_mrbccd"); //填充DataSet数据集//使用LINQ从数据集中查询所有数据varquery=fromsalaryinmyds.Tables["tb_mrbccd"].AsEnumerable()selectsalary;DataTablemyDTable=query.CopyToDataTable<DataRow>();//将查询结果转化为DataTableGridView1.DataSource=myDTable; //显示查询到的数据集中的信息GridView1.DataBind();}13.4.3使用LINQ操作XML文件对XML文件进行操作时可以使用LINQtoXML技术,它是LINQ技术中的一种,它提供了修改文档对象模型的内存文档,并支持LINQ查询表达式等功能,下面对LINQtoXML技术中常用到的方法进行详细讲解。(1)XElement类的Load方法Xelement类表示一个XML元素,其Load方法用来从文件加载Xelement,该方法语法格式如下:publicstaticXElementLoad(stringuri)uri:一个URI字符串,用来引用要加载到新XElement中的文件。返回值:一个包含所指定文件的内容的XElement。(2)XElement类的SetAttributeValue方法SetAttributeValue方法用来设置属性的值、添加属性或移除属性,其语法格式如下:publicvoidSetAttributeValue(XNamename,Objectvalue)name:一个XName,其中包含要更改的属性的名称。value:分配给属性的值。如果该值为null,则移除该属性;否则,会将值转换为其字符串表示形式,并分配给该属性的Value属性。(3)XElement类的Add方法Add方法用来将指定的内容添加为此XContainer的子级,其语法格式如下:publicvoidAdd(Objectcontent)参数content表示要添加的包含简单内容的对象或内容对象集合。(4)XElement类的ReplaceNodes方法ReplaceNodes方法用来使用指定的内容替换此文档或元素的子节点,其语法格式如下:publicvoidReplaceNodes(Objectcontent)参数content表示一个用于替换子节点的包含简单内容的对象或内容对象集合。(5)XElement类的Save方法Save方法用来序列化此元素的基础XML树,可以将输出保存到文件、XmlTextWriter、TextWriter或XmlWriter,其语法格式如下:publicvoidSave(stringfileName)参数fileName表示一个包含文件名称的字符串。(6)XDocument类的Save方法XDocument类表示XML文档,其Save方法用来将此XDocument序列化为文件、TextWriter或XmlWriter,该方法语法格式如下:publicvoidSave(stringfileName)参数fileName表示一个包含文件名称的字符串。(7)XDeclaration类XDeclaration类表示一个XML声明,其构造函数语法格式如下:publicXDeclaration(stringversion,stringencoding,stringstandalone)version:XML的版本,通常为“1.0”。encoding:XML文档的编码。standalone:包含“yes”或“no”的字符串,用来指定XML是独立的还是需要解析外部实体。说明:使用LINQtoXML技术中的类时,需要添加System.Xml.Linq命名空间。【例13-12】本实例主要演示如何使用LINQ技术对XML文件进行添加、修改、删除及查询等操作。实例运行效果如图13-19所示。图13-19使用LINQ操作XML文件程序开发步骤如下:(1)新建一个网站,默认主页为Default.aspx。(2)在Default.aspx页面上添加两个TextBox控件,分别用来输入和显示姓名、薪水;添加一个DropDownList控件,用来选择性别;添加3个Button控件,分别用来执行添加、修改和删除操作;添加一个GridView控件,用来显示XML文件中的数据。(3)在Default.aspx.cs代码页中,首先定义两个字符串类型的全局变量,分别用来记录XML文件路径及选中的ID编号,代码如下:staticstringstrPath=""; //记录XML文件路径staticstringstrID=""; //记录选中的ID编号(4)在Default.aspx.cs代码页中自定义一个getXmlInfo方法,该方法为用来将XML文件中的内容绑定到GridView控件中。getXmlInfo方法实现代码如下:#region将XML文件内容绑定到DataGridView控件///<summary>///将XML文件内容绑定到DataGridView控件///</summary>privatevoidgetXmlInfo(){DataSetmyds=newDataSet(); //创建DataSet数据集对象myds.ReadXml(strPath); //读取XML结构GridView1.DataSource=myds.Tables[0]; //在DataGridView中显示XML文件中的信息GridView1.DataKeyNames=newstring[]{"ID"};//绑定主键字段GridView1.DataBind();}#endregion(5)Default页面加载时,调用自定义的getXmlInfo方法将XML文件中的数据显示在GridView控件。代码如下:protectedvoidPage_Load(objectsender,EventArgse)strPath=Server.MapPath("Employee.xml"); //记录XML文件路径if(!IsPostBack)getXmlInfo(); //页面加载时加载XML文件(6)单击“添加”按钮,使用LinqToXML技术向指定的XML文件中插入用户输入的数据,并重新保存XML文件。“添加”按钮的Click事件代码如下:protectedvoidButton1_Click(objectsender,EventArgse)XElementxe=XElement.Load(strPath); //加载XML文档//创建IEnumerable泛型接口IEnumerable<XElement>elements1=fromelementinxe.Elements("People")selectelement;//生成新的编号stringstr=(Convert.ToInt32(elements1.Max(element=>element.Attribute("ID").Value))+1).ToString("000");XElementpeople=newXElement( //创建XML元素"People",newXAttribute("ID",str), //为XML元素设置属性newXElement("Name",TextBox1.Text),newXElement("Sex",DropDownList1.Text),newXElement("Salary",TextBox2.Text));xe.Add(people); //添加XML元素xe.Save(strPath); //保存XML元素到XML文件getXmlInfo();}(7)当用户在GridView控件中选择某记录时,使用LinqToXML技术在XML文件中查找选中记录的详细信息,并显示到相应的文本框和下拉列表中。实现代码如下:protectedvoidGridView1_SelectedIndexChanging(objectsender,GridViewSelectEventArgse){//记录选中的ID编号strID=GridView1.DataKeys[e.NewSelectedIndex].Value.ToString();XElementxe=XElement.Load(strPath); //加载XML文档//根据编号查找信息IEnumerable<XElement>elements=fromPInfoinxe.Elements("People")wherePInfo.Attribute("ID").Value==strIDselectPInfo;foreach(XElementelementinelements) //遍历查找到的所有信息{TextBox1.Text=element.Element("Name").Value; //显示员工姓名DropDownList1.Text=element.Element("Sex").Value;//显示员工性别TextBox2.Text=element.Element("Salary").Value; //显示员工薪水}}(8)单击“修改”按钮,首先判断是否选定要修改的记录,如果已经选定,则使用LinqToXML技术修改XML文件中的指定记录,并重新保存XML文件。“修改”按钮的Click事件代码如下:protectedvoidButton2_Click(objectsender,EventArgse){if(strID!="") //判断是否选择了编号{XElementxe=XElement.Load(strPath); //加载XML文档//根据编号查找信息IEnumerable<XElement>elements=fromelementinxe.Elements("People")whereelement.Attribute("ID").Value==strIDselectelement;if(elements.Count()>0) //判断是否找到了信息{XElementnewXE=elements.First(); //获取找到的第一条记录newXE.SetAttributeValue("ID",strID); //为XML元素设置属性值newXE.ReplaceNodes( //替换XML元素中的值newXElement("Name",TextBox1.Text),newXElement("Sex",DropDownList1.Text),newXElement("Salary",TextBox2.Text));}xe.Save(strPath); //保存XML元素到XML文件}getXmlInfo();}(9)单击“删除”按钮,首先判断是否选定要删除的记录,如果已经选定,则使用LinqToXML技术删除XML文件中的指定记录,并重新保存XML文件。“删除”按钮的Click事件代码如下:protectedvoidButton3_Click(objectsender,EventArgse){if(strID!="") //判断是否选择了编号{XElementxe=XElement.Load(strPath); //加载XML文档//根据编号查找信息IEnumerable<XElement>elements=fromelementinxe.Elements("People")whereelement.Attribute("ID").Value==strIDselectelement;if(elements.Count()>0) //判断是否找到了信息elements.First().Remove(); //删除找到的XML元素信息xe.Save(strPath); //保存XML元素到XML文件}getXmlInfo();}13.5综合实例——使用LINQ实现数据分页使用GridView控件呈现数据时,一般都需要对其进行分页显示,分页方式上通常采用的是GridView自带的分页功能,但这种分页方式扩展性差,最主要的是它不能实现真正意义上的分页,即每次从数据库只读取当前页的数据。本实例使用LINQ技术实现对GridView控件中数据进行分页显示的功能,实例运行结果如图13-20所示。图13-20使用LINQ实现数据分页程序开发步骤如下:(1)新建一个ASP.NET网站,命名为LinqPager,默认主页为Default.aspx。(2)在Default.aspx页面中添加一个GridView控件,用来显示数据库中的商品信息;添加4个LinkButton控件,分别用来作为首页、上一页、下一页和尾页按钮。(3)按照13.3.1节的步骤建立LINQ数据源,数据源为db_ASPNET数据库中的Goods数据表。(4)Default.aspx页面的后台代码中,首先创建LINQ对象,并定义每页显示的记录数,代码如下:LinqDBDataContextldc=newLinqDBDataContext(); //创建LINQ对象intpageSize=3; //设置每页显示3行记录(5)自定义一个getCount方法,该方法用来计算表中的数据一共可以分为多少页。在该方法中,首先获取总的数据行数,并通过总数据行数除以每页显示的行数获取可分的页数;然后使用计算出的总数据行数对每页显示的行数求余,如果求余大于0,将获取1,否则获取0;最后将两个数相加并返回。代码如下:protectedintgetCount(){intsum=ldc.Goods.Count(); //设置总数据行数ints1=sum/pageSize; //获取可以分的页面//当总行数对页数求余后是否大于0,如果大于获取1否则获取0ints2=sum%pageSize>0?1:0;intcount=s1+s2; //计算出总页数returncount;}(6)自定义一个bindGrid方法,该方法用来对数据表中的数据进行分页操作,并将分页后的结果绑定到GridView控件上。代码如下:protectedvoidbindGrid()//获取当前页数intpageIndex=Convert.ToInt32(ViewState["pageIndex"]);//使用LINQ查询,并对查询的数据进行分页varresult=(fromvinldc.Goodsselectnew商品编号=v.goodsID,

商品名称

=v.goodsName,

商品价格

=v.goodsPrice,

销售数量

=v.sumSell}).Skip(pageSize*pageIndex).Take(pageSize);gvGoods.DataSource=result; //设置GridView控件的数据源gvGoods.DataBind(); //绑定GridView控件lnkbtnBottom.Enabled=true;lnkbtnFirst.Enabled=true;lnkbtnUp.Enabled=true;lnkbtnDown.Enabled=true;//判断是否为第一页,如果为第一页隐藏首页和上一页按钮if(Convert.ToInt32(ViewState[“pageIndex”])==0)lnkbtnFirst.Enabled=false;lnkbtnUp.Enabled=false;//判断是否为最后一页,如果为最后一页隐藏尾页和下一页按钮if(Convert.ToInt32(ViewState[“pageIndex”])==getCount()-1)lnkbtnBottom.Enabled=false;lnkbtnDown.Enabled=false;}(7)Default.aspx页面加载时,首先设置当前的页数,然后调用自定义bindGrid方法实现分页功能。代码如下:protectedvoidPage_Load(objectsender,EventArgse){if(!IsPostBack){ViewState["pageIndex"]=0; //设置当前页面//调用自定义bindGrid方法绑定GridView控件bindGrid();}}说明:

在ASP.NET中,ViewState是ASP.NET页在页面切换时保留页和控件属性值的默认方法。本实例将当前页码保存在了ViewState["pageIndex"]中。(8)在“首页”、“上一页”、“

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论