第13章 统一数据查询模式——LINQ
本章视频教学录像:55分钟
LINQ是微软公司提供的一种统一查询模式,LINQ可以对多种数据源和对象进行查询,如数据库、数据集、XML文档甚至是数组,传统的查询语句是很难实现的,而使用LINQ可以仿真SQL语句的形式进行查询,极大地降低了难度。
本章要点(已掌握的在方框中打钩)
□ LINQ查询语法
□ LINQ 的查询子句
□ LINQ 简单查询
□ LINQ 对数据库的增删改
□ EntityDataSource 控件应用
13.1 LINQ技术概述
本节视频教学录像:6分钟
LINQ是Language Integrated Query的缩写,中文意思是“语言集成查询”,它引入了标准的、易学习的查询模式和更新模式,可以对其进行扩展以便支持几乎任何类型的数据存储。它让程序员不需要关心访问的是关系数据库还是XML数据或是远程对象,因为它都采用相同的访问方式。Visual Studio 2010包含LINQ提供程序的程序集,这些程序集支持LINQ与.NET Framework、SQL Server数据库、ADO.NET数据集以及XML文档一起使用。
LINQ是一系列的技术,包括LINQ、DLINQ以及XLINQ等。其中LINQ到对象是对内存进行操作, LINQ到SQL是对数据库进行操作,LINQ到XML是对XML数据进行操作。
提示
LINQ是在.NET 3.5以后新增的,所以早期的版本是不能直接使用LINQ查询的,若要在以前的版本中使用LINQ,首先要通过Visual Studio 2010将程序自动转换为.NET 3.5以后的版本。
简单来说,LINQ包括五个部分的内容,如图所示。
LINQ to Object:指直接对任意IEnumerable或IEnumerable<T>集合使用LINQ查询,无法使用中间LINQ提供程序或API,如LINQ to SQL 或LINQ to XML。可以使用LINQ来查询任何可枚举的集合,如List<T>、Array或Dictionary<Tkey,Tvalue>。该集合可以是用户自定义的集合,也可以是.NET Framework API返回的集合。
LINQ to DataSet:它将LINQ和ADO.NEt集成,通过ADO.NET获取数据,然后通过LINQ进行数据查询,从而实现对数据集进行非常复杂的查询。可以简单把它理解成通过LINQ对DataSet中保存的数据进行查询。
LINQ to SQL:它是基于关系数据的.NET语言集成查询,用于以对象形式管理关系数据,并提供了丰富的查询功能。其建立于公共语言类型系统中的基于SQL的模式定义的集成之上,当保持关系型模型表达能力和对底层存储的直接查询评测的性能时,这个集成的关系型数据只提供强类型。
LINQ to Entities:它使开发人员能够通过使用LINQ表达式和LINQ标准查询运算符,直接从开发环境中针对实体框架对象上下文创建灵活的强类型查询。
LINQ to XML:在System.Xml.LINQ命名空间下实现对XML的操作,采用高效、易用、内存中的XML工具在宿主编程语言中提供XPath/XQuery功能等。
13.2 LINQ查询语法概述
本节视频教学录像:4分钟
在LINQ出现以前,如果要查询数据库,需要使用SQL查询语言;但如果要查询XML文档,就还需要学习XQuery查询语言或者Xpath。但是LINQ的出现使这些复杂的查询化简成一个简单的查询语句。不仅如此,LINQ还支持编程语言本有的特性进行高效的数据访问和筛选。虽然LINQ在语法上和SQL语句十分相似,但是LINQ语句在查询语法上和SQL语句还是有区别的。
LINQ的查询包含三个不同的、独立的步骤。
⑴获取数据源。
⑵创建查询。
⑶执行查询。
【范例13-1】从数据源firstexample中查找以“S”开头的字符串,并按降序存储到result中。
⑴在Visual Studio 2010中新建一个名为LINQ_1的ASP.NET空网站,添加一个Default.aspx的页面并切换到设计视图。
⑵从工具箱【标准】控件中添加一个【Label】组件。
⑶双击页面或者按【F7】键,打开Default.aspx.cs,在Page_Lord()中输入以下代码。
01 protected void Page_Load(object sender,EventArgs e)
02 {
03 //创建数据源
04 string[] firstexample= { "Sco", "ASP.NET", "LINQ", "XML", "SQL" };
05 //创建查询
06 IEnumerable<string> result= from str in firstexample
07 where str.StartsWith("S")
08 orderby str descending
09 select str;
10 //执行查询
11 foreach (string s in result) {
12 Label1.Text+= s+ "<br>";
13 }
14 }
【运行结果】
按【Ctrl+F5】组合键运行,运行结果如下图所示。
提示
LINQ查询语言与SQL语言只是相似,并不完全一样。最重要的不同就是LINQ查询语句中select是放在后边的,这是为了方便确定查询变量的数据类型。
13.3 LINQ常用子句
本节视频教学录像:16分钟
LINQ的基本格式如下所示:
var <变量>= from <项目> in <数据源> where <表达式> orderby <表达式>
group <项目> by <表达式> select <项目>
同SQL查询语句一样,LINQ查询语句也提供from、select、where、orderby、group等关键字,这些关键字是LINQ中的常用子句,下面我们将一一介绍。
13.3.1 from查询子句
from子句是LINQ查询语句中最基本的,同时也是最重要的、必须的子句关键字。与SQL查询语句不同的是,from关键字必须在LINQ查询语句的开始,后面跟随着项目名称和数据源,格式如下:
from <项目> in <数据源>
【范例13-2】用from子句查询。
⑴在Visual Studio 2010中创建一个名为LINQFrom1的ASP.NET空网站,添加一个Default.aspx页面并切换到设计视图。
⑵从工具箱【标准】控件中添加一个【Label】控件。
⑶添加一个C#类,命名为“Student”,并输入以下代码。
01 using System;
02 using System.Collections.Generic;
03 using System.LINQ;
04 using System.Web;
05 public class Student
06 {
07 public string Name {get;set; }
08 public int age {get; set; }
09 }
⑷双击Default.aspx页面切换到cs代码页面,在Page_Load中输入以下代码。
01 protected void Page_Load(object sender,EventArgs e)
02 {
03 ArrayList at=new ArrayList();
04 at.Add(new Student
05 {
06 Name= "张三 ",
07 age=21,
08 });
09 at.Add(new Student
10 {
11 Name= "李四 ",
12 age= 22,
13 });
14 at.Add(new Student
15 {
16 Name= "王五 ",
17 age= 19,
18 });
19 var query= from Student s in at where s.age> 20 select s;
20 foreach (Student stu in query)
21 {
22 Label1.Text+= stu.Name+" "+ stu.age.ToString()+ "<br>";
23 }
24 }
【运行结果】
按【Ctrl+F5】组合键运行,运行结果如下图所示。
【范例分析】
本例使用ArrayList 来存储Student对象作为数据源,在新建Student对象时,需要分别为它的两个属性赋值。此外在用ArrayList时,需要引用using System.Collections。
提示
from子句的数据源类型必须为IEnumerable、IEnumerable<T>类型或者IEnumerable、IEnumerable<T>的派生类,否则不能够支持LINQ查询语句。
除了简单查询以外,from查询子句还支持嵌套查询。如果需要进行复杂的复合查询,可以使用from子句中嵌套另一个from子句来实现这样的复合查询。
【范例13-3】from子句的嵌套。
⑴在Visual Studio 2010中创建一个名为LINQFrom2的ASP.NET空网站,添加一个Default.aspx的页面并切换到设计视图。
⑵从工具箱【标准】控件中添加一个【Label】组件。
⑶双击Default.aspx页面或者按F7键切换到cs代码页面,在Page_Load中输入以下代码。
01 protected void Page_Load(object sender,EventArgs e)
02 {
03 List<string> name=new List<string>();
04 name.Add("zhangwei");
05 name.Add("zhangsan");
06 name.Add("lisi");
07 name.Add("wangwu");
08 List<string> email=new List<string>();
09 email.Add("zhangwei@163.com");
10 email.Add("zhangsan@163.com");
11 email.Add("lisi@163.com");
12 email.Add("wangwu@163.com");
13 var result= from namedata in name
14 from emaildata in email
15 where emaildata.Contains(namedata)
16 select namedata;
17 foreach(var i in result)
18 {
19 Label1.Text+= i.ToString()+ "<br>";
20 }
21 }
【运行结果】
按【Ctrl+F5】组合键运行,运行结果如下图所示。
【范例分析】
在本例中,查询语句的意义为:从email中选出包含name中姓名的邮箱地址。这就是用from实现复合查询,即一个查询依赖于另一个查询的结果。
13.3.2 select选择子句
同from子句一样,select子句也是LINQ查询语句中必不可少的关键字。在LINQ查询子句中必须包含select子句,若不包含则系统会抛出异常(特殊情况除外)。select子句制定了返回到集合变量中的元素是来自哪个数据源的。
【范例13-4】select子句的查询。
⑴在Visual Studio 2010中创建一个名为LINQSelect的ASP.NET空网站,添加一个Default.aspx的页面并切换到设计视图。
⑵从工具箱中添加一个“Label”组件。
⑶双击Default.aspx页面切换到cs代码页面,在Page_Load中输入以下代码。
01 protected void Page_Load(object sender,EventArgs e)
02 {
03 List<string> name=new List<string>();
04 name.Add("zhangwei");
05 name.Add("zhangsan");
06 name.Add("lisi");
07 name.Add("wangwu");
08 List<string> email=new List<string>();
09 email.Add("zhangwei@163.com");
10 email.Add("zhangsan@163.com");
11 email.Add("lisi@163.com");
12 email.Add("wangwu@163.com");
13 var result= from namedata in name
14 from emaildata in email
15 where emaildata.Contains(namedata)
16 select emaildata;
17 foreach(var i in result)
18 {
19 Label1.Text+= i.ToString()+ "<br>";
20 }
21 }
【运行结果】
按【Ctrl+F5】组合键运行,如下图所示。
【范例分析】
在本例中,只是将查询语句中的select namedata改为select emaildata,结果就完全不一样。这是因为select选择查询的数据来自emaildata而不再是来自namedata。
提示
LINQ.查询表达式必须以select子句或者group子句结束,否则会出错。
13.3.3 where条件子句
同SQL语句一样,where用于指定条件,用来筛选数据源中的数据。where 子句可以放在除第一个或最后一个子句以外的任何位置。where子句可以出现在group子句的前面或者后面,具体情况取决于是必须在对数据元素进行分组之前还是之后来筛选元素。where子句中还可以使用&&和||运算符,根据需要指定任意多个谓词。
【范例13-5】where子句的查询。
⑴在Visual Studio 2010中创建一个名为LINQWhere的ASP.NET空网站,添加一个Default.aspx的页面并切换到设计视图。
⑵从工具箱【标准】控件中添加一个【Label】组件。
⑶双击Default.aspx页面切换到cs代码页面,在Page_Load中输入以下代码。
01 protected void Page_Load(object sender,EventArgs e)
02 {
03 string[] str= { "abc", "abcdef", "ab", "hhhhh", "hhhabc", "dhabc" };
04 var result= from data in str where data.Contains("abc")&& data.Contains("d") select data;
05 foreach (var i in result)
06 {
07 Label1.Text+= i.ToString()+ "<br>";
08 }
09 }
【运行结果】
按【Ctrl+F5】组合键运行,运行结果如下图所示。
【范例分析】
在本例中,查询语句的意义为:从str中查找包含“abc”和“d”的字符串。因为“abc”和“d”的位置并不固定,所以不能直接用“abcd”一个条件来表示。
13.3.4 orderby排序子句
Orderby子句可以是返回的序列或者子序列按升序或者降序进行排序,可以指定一个或者多个键。默认的排序顺序是升序,也可以通过指定descending 改为降序。
【范例13-6】在查询语句中使用orderby子句进行排序。
⑴在Visual Studio 2010中创建一个名为LINQOrderby的ASP.NET空网站,添加一个Default. aspx的页面并切换到设计视图。
⑵从工具箱【标准】控件中添加一个【Label】组件。
⑶双击Default.aspx页面切换到cs代码页面,在Page_Load中输入以下代码。
01 protected void Page_Load(object sender,EventArgs e)
02 {
03 int [] num= {46,47,48,49,50,51,52,53,54,};
04 var result= from data in num wheredata> 50 orderby data descending select data;
05 foreach(var i in result)
06 {
07 Label1.Text+= i.ToString()+"<br>";
08 }
09 }
【运行结果】
按【Ctrl+F5】组合键运行,运行结果如下图所示。
【范例分析】
在本例中,从num数组中查询大于50的数,且按降序输出。此时的orderby指定了排序顺序为降序,读者可以把descending去掉,变成升序。
13.3.5 group分组子句
在LINQ查询语句中,group子句对from语句执行的查询结果进行分组,并返回元素类型为IGrouping<Tkey,TElement>的对象序列。Group子句支持将数据源中的数据进行分组。但进行分组前,数据源必须支持分组操作才可使用group语句进行分组处理。
【范例13-7】在查询语句中运用group子句对查询结果进行分组。
⑴在Visual Studio 2010中创建一个名为LINQGroup的ASP.NET空网站,添加一个Default.aspx的页面并切换到设计视图。
⑵从工具箱【标准】控件中添加一个【Label】组件。
⑶添加一个C#类,命名为“Student”,并输入以下代码。
01 public class Student
02 {
03 public int age;
04 public string Name;
05 public Student(int age, string name)
06 {
07 this.age= age;
08 this.Name= name;
09 }
10 }
⑷双击Default.aspx页面切换到cs代码页面,在Page_Load中输入以下代码。
01 protected void Page_Load(object sender,EventArgs e)
02 {
03 List<Student>person=new List<Student>();
04 person.Add(new Student(25,"张三 "));
05 person.Add(new Student(26,"张华 "));
06 person.Add(new Student(25,"小西 "));
07 person.Add(new Student(24,"张军 "));
08 person.Add(new Student(26,"张雨 "));
09 var result= from p in person
10 orderby p.age ascending
11 group p by p.age;
12 foreach(var element in result)
13 {
14 Label1.Text+= element.Key+ "岁组的学生有:";
15 foreach(Student pa in element)
16 {
17 Label1.Text+=pa.Name.ToString()+ ",";
18 }
19 Label1.Text+= "<br>";
20 }
21 }
【运行结果】
按【Ctrl+F5】组合键运行,运行结果如下图所示。
【范例分析】
本例中创建了五个Student对象作为数据源,把数据源中的学生按年龄分组,然后输出。
13.4 使用LINQ操作和访问数据库
本节视频教学录像:27分钟
LINQ to SQL 是ASP.NET4.0的关键组件,是ADO.NET和LINQ结合的产物。它是将关系型数据库模型映射到编程语言所表示的对象模型。开发人员通过使用对象模型来实现对数据库数据进行操作。在操作过程中,LINQ to SQL会将模型中的语言集成查询转换为SQL,然后将它们发送到数据库进行执行。当数据库返回结果时,LINQ to SQL会将它们转换成相应的编程语言处理对象。
要想实现LINQ to SQL,分为两大步:
首先必须根据现有关系型数据库的元数据创建对象模型。对象模型就是按照开发人员所用的编程语言来表示数据库。有了这个表示数据库的对象模型,才能创建增删改查的语句操作数据库。创建对象模型有以下3种方法。
⑴使用对象关系设计器。对象关系设计器提供了从现有数据库创建对象模型的可视化操作,它被集成在Visual Studio 2010中,比较适用于小型或中型的数据库。
⑵使用SQLMetal代码生成工具。这个工具适合大型的数据库开发。
⑶直接编写创建对象的代码。
其次就是在创建了对象模型之后,在该模型中请求和操作数据库。使用对象模型的基本步骤如下。
⑴创建查询,以便从数据库中检索出信息。
⑵重写insert、update和delete的默认方法。
⑶设置适当的选项,以便监测和报告可能发生的并发冲突。
⑷建立继承层次结构。
⑸提供合适的用户界面。
⑹调试并测试应用程序。
这些只是使用对象模式的基本操作,其中的很多步骤都是可选和重复的。
这里我们展示如何使用对象关系设计器来创建LINQ to SQL实体类。
⑴新建一个空网站,单击【视图】【服务器资源管理器】【数据连接】,单击右键,选择【添加连接】命令。如图所示。
⑵数据源选择【Microsoft SQL Server数据库文件】,单击【浏览】按钮,选择相应的数据库,确定后单击【测试连接】按钮,成功后单击【确定】按钮。如图所示。
⑶成功后将能在左边看到相应数据库,并可看到相应的表。如图所示。
⑷选择【添加新项】【LINQ to SQL类】,如图所示。
⑸单击“添加”后,在出现的界面中把要用到的表拖到界面中,如图所示。
⑹保存后,右侧的【解决方案资源管理器】如下图所示。
到此时为止,数据库添加完毕。在创建的Web窗体或是C#类中就可以调用DataClassesDataContext(继承自DataContext)创建对象,并对数据库中的数据进行操作。
提示
在运行Visual Studio 2010时,要以管理员身份运行,否则可能会导致数据库应为权限原因而无法连接。
13.4.1 简单查询
对象关系设计器用于在应用程序中创建映射到数据库中的对象类型,同时,它还生成一个强类型DataClassesDataContext类,继承DataContext。DataContext类是System.Data.LINQ名称空间的一部分,其目的是把请求从.NET对象转换成SQL查询,然后将查询结果重组到对象中。自建一个强类型的DataContext非常简单,只需要创建一个继承自DataContext类的新类。例如:
01 public class Student:DataContext
02 {
03 Public student (string connection) :base (connection) {}
04 //table definitions
05 }
创建好DataContext类之后就可以使用其对数据库进行查询。DataContext类提供了下表中的属性和方法。
DataContext类的属性及说明如下表所示。
DataContext类的方法及说明如下表所示。
【范例13-8】查询数据库。
⑴在Visual Studio 2010中创建一个名为LINQDataAccess的ASP.NET空网站,添加一个Default. aspx页面并切换到设计视图。
⑵从工具箱【数据】控件中添加一个【GridView】控件。
⑶使用对象关系设计器添加数据库Student。
⑷双击Default.aspx页面切换到cs代码页面,在Page_Lord中添加以下代码。
01 protected void Page_Load(object sender,EventArgs e)
02 {
03 DataClassesDataContext db= newDataClassesDataContext();
04 var userQ= from s in db.studentinfo select s;
05 GridView1.DataSource= userQ;
06 GridView1.DataBind();
07 }
【运行结果】
按【Ctrl+F5】组合键运行,运行结果如下图所示。
13.4.2 数据库的增删改查操作
除了查找之外,还可以进行插入、更新、删除等操作。
1. LINQ插入操作
使用LINQ向数据库插入行的操作步骤如下。
⑴创建一个要提交到数据库的新对象。
⑵将这个新对象添加到与数据库中目标数据表关联的LINQ to SQL Table集合。
⑶将更改提交到数据库。
【范例13-9】向数据库中插入数据。
⑴在Visual Studio 2010中创建一个名为LINQInsert的ASP.NET空网站,添加一个Default.aspx页面并切换到设计视图。
⑵使用对象关系设计器添加数据库Student。
⑶从工具箱控件中添加五个文本框、一个GridView控件和一个Button按钮,如图所示。
⑷修改控件属性,如表所示。
⑸双击Default.aspx页面切换到cs代码页面,添加一个gdBind()方法。
01 protected void gvBind()
02 {
03 DataClassesDataContextdb= newDataClassesDataContext();
04 var user= from s in db.studentinfo select s;
05 gvStudent.DataSource= user;
06 gvStudent.DataBind();
07 }
⑹在Page_Lord中添加对gvBind()方法的调用。
01 protected void Page_Load(object sender,EventArgs e)
02 {
03 gdBind();
04 }
⑺双击btnInsert按钮,打开btnInsert_Click()事件,添加以下代码:
01 protected void btnInsert_Click(object sender,EventArgs e)
02 {
03 DataClassesDataContext db= new DataClassesDataContext();
04 studentinfo stu= new studentinfo();
05 stu.SNO= txtSno.Text.Trim();
06 stu.SNAME= txtName.Text;
07 stu.GENDER= txtGender.Text;
08 stu.BIRTHDAY=Convert.ToDateTime(txtBirthday.Text);
09 stu.DEPTNAME= txtDept.Text;
10 db.studentinfo.InsertOnSubmit(stu);
11 db.SubmitChanges();
12 gvBind();
13 }
【运行结果】
按【Ctrl+F5】组合键运行,在相应的文本框中输入要录入的信息,如下图所示,点击【录入信息】按钮即可实现录入数据。
【范例分析】
在本例中,首先通过自定义的gvBind()方法借助DataClassesDataContext对象实现对数据库的查询;在录入按钮事件中创建一个studentinfo的对象,通过相应的文本框对其各个属性进行赋值,然后通过DataClassesDataContext的对象db把数据写到数据库。
2. LINQ修改操作
使用LINQ修改数据库数据的操作步骤如下:
⑴查询数据库中要更新的数据行。
⑵更改LINQ to SQL对象中的成员值。
⑶将更改后的数据提交到数据库。
【范例13-10】修改数据库中的数据。
⑴在 Visual Studio 2010 中创建一个名为 LINQUpdate 的 ASP.NET 空网站,添加一个 Default. aspx页面并切换到设计视图。
⑵使用对象关系设计器添加数据库Student。
⑶从工具箱控件中添加两个文本框、一个GridView控件和一个Button按钮,如图所示。
⑷修改控件属性,如表所示。
⑸双击Default.aspx页面切换到cs代码页面,添加一个gdBind()方法。
01 protected void gvBind()
02 {
03 DataClassesDataContextdb= newDataClassesDataContext();
04 var user= from s in db.studentinfo select s;
05 gvStudent.DataSource= user;
06 gvStudent.DataBind();
07 }
⑹在Page_Lord中添加对gvBind()方法的调用。
01 protected void Page_Load(object sender,EventArgs e)
02 {
03 gdBind();
04 }
⑺双击btnUpdate按钮,打开btnUpdate_Click事件,添加以下代码。
01 protected void btnUpdate_Click(object sender,EventArgs e)
02 {
03 DataClassesDataContextdb= new DataClassesDataContext();
04 var query= from stu in db.studentinfo where stu.SNO== txtSno.Text select stu;
05 foreach (studentinfo s in query)
06 {
07 s.SNAME= txtName.Text;
08 }
09 db.SubmitChanges();
10 gvBind();
11 }
【运行结果】
按【Ctrl+F5】组合键运行,输入相应的数据,点击【更改姓名】按钮即可实现数据更改。如下图所示。
【范例分析】
在本例中,通过输入的学号数据查找到相应的数据,然后把姓名字段改为输入的姓名。
3. LINQ删除操作
可以通过将对应的LINQ to SQL对象从相关的集合中移除来实现删除数据库中的行。不过,LINQ to SQL不支持且无法识别级联删除操作。如果要在对行有约束的表中删除数据,则必须符合以下条件之一。
⑴在数据库的外键约束中设置ON DELETE CASCADE规则。
⑵先删除约束表的级联关系。
删除数据库中的数据行的操作步骤如下。
⑴查询数据库中要删除的行。
⑵调用DeleteOnSubmit方法。
⑶将更改后的数据提交到数据库。
【范例13-11】删除数据库中的数据。
⑴在Visual Studio 2010中创建一个名为LINQDelete的ASP.NET空网站,添加一个Default.aspx页面并切换到设计视图。
⑵使用对象关系设计器添加数据库Student。
⑶从工具箱控件中添加一个文本框、一个GridView控件和一个Button按钮,如图所示。
⑷修改控件属性,如表所示。
⑸双击Default.aspx页面切换到cs代码页面,添加一个gdBind()方法,用于绑定gvStudent控件。
01 protected void gvBind()
02 {
03 DataClassesDataContextdb= newDataClassesDataContext();
04 var user= from s in db.studentinfo select s;
05 gvStudent.DataSource= user;
06 gvStudent.DataBind();
07 }
⑹在Page_Lord中添加对gvBind()方法的调用。
01 protected void Page_Load(object sender,EventArgs e)
02 {
03 gdBind();
04 }
⑺双击btnDelete按钮,打开btnDelete_Click事件,添加以下代码。
01 protected void btnDelete_Click(object sender,EventArgs e)
02 {
03 DataClassesDataContext db= new DataClassesDataContext();
04 var delstu= from stu in db.studentinfo where stu.SNAME== txtSno.Text select stu;
05 foreach (var s in delstu)
06 {
07 db.studentinfo.DeleteOnSubmit(s);
08 }
09 db.SubmitChanges();
10 var user= from s in db.studentinfo select s;
11 gvBind();
12 }
【运行结果】
按【Ctrl+F5】组合键运行,输入相应的数据,点击【删除】按钮即可实现删除操作。如下图所示。
【范例分析】
在本例中,通过学号这个属性查找相应数据,并把相应学号的学生从数据库中删除。
13.4.3 EntityDataSource控件
EntityDataSource 控件利用 ADO.NET Entity Framework 中的对象服务组件,将实体数据模型(EDM) 定义的绑定数据简化为 ASP.NET Web 应用程序中的控件。这使得该控件可以撰写和执行对象查询,并将控件绑定到返回的对象,这些对象是在 EDM 中定义的实体类型的实例。也就是说,使用 EntityDataSource 时,不需要编写任何代码,甚至 EntityDataSource 要更进一步,不仅不需要编写C# 代码,还可以略过编写查询和更新数据使用的 SQL 语句,直接修改数据库。本节将主要介绍使用EntityDataSource在应用程序中动态地改变数据库中数据。
【范例13-12】用EntityDataSource修改数据库中的数据。
⑴在Visual Studio 2010中创建一个名为LINQEntityDataSource的ASP.NET空网站,添加一个Default.aspx页面并切换到设计视图。
⑵在项目名称上单击右键,选择【添加新项】【ADO.NET实体数据模型】,单击【添加】,系统提示是否放到App_Code文件夹中,单击【是】。弹出【实体数据模型向导】窗口,点击【下一步】,打开【连接属性】窗口。此处数据源选择【Microsoft SQL Server数据库文件】,通过【浏览】找到数据库文件。
⑶单击【确定】按钮,然后依次单击【下一步】按钮,在【选择数据库对象】窗口选择【表】,单击【完成】按钮。
⑷添加一个Default.aspx页面并切换到设计视图,从工具箱中添加一个GridView控件和一个EntityDataSource控件。选择EntityDataSource,选择【配置数据源】,在“命名连接”的下拉框中选择“StudentEntity”。在“EntitySetName”下拉框中选择“studentinfo”,select框中选择“选择所有(实体值)”,同时选中“启用自动插入”、“启用自动跟新”和“启用自动删除”三个复选框。单击【完成】按钮,如图所示。
⑸将EntityDataSource绑定到GridView上,选择“启用编辑”和“启用删除”两个复选框。
【运行结果】
按【Ctrl+F5】组合键运行,输入相应的数据,单击【删除】按钮即可实现删除操作。如下图所示。
13.5 高手点拨
本节视频教学录像:2分钟
LINQ可以防止SQL注入
SQL注入攻击是Web应用程序中的一种安全漏洞,可以将不安全的数据提交给应用程序。使用该攻击可以很轻松地登录应用程序。如管理员的登录名为Admin,SQL语句为:select count(*) from userTable where Name=’Admin’;如果在登录名文本框中输入“abc’or’1’=’1”,单击登录按钮,此时SQL语句将会转换为:Select count(*) from userTable where name=’abc’or‘1’=’1’;可以看出,这条语句将会查出表中的所有信息。而使用LINQ则可以防止该情况的出现。大家可以自行研究。
13.6 实战练习
1. 使用LINQ语句计算studentinfo中所有男同学的平均年龄。
2. 使用LINQ查询Studentinfo中的所有学生的信息,并用GridView控件显示。
共有条评论 网友评论