本文共 10748 字,大约阅读时间需要 35 分钟。
举例说明 :
1.数据查询
方法一:
Var query=
from emp in list
where emp.N0=="001"
orderby emp.id
select emp
方法二:
model1Container mc = new model1Container ();
List<employee> list = mc.employee.where(w => w.no=="001").Tolist();
2.新增语法
employee emp = new employee();
emp.No = "001";
emp.Name="user";
using(model1Container mc = new model1Container ())
{
mc.AddToemployee(emp);
mc.Savechanges();
}
3.删除语法
using(model1Container mc = new model1Container ())
{
employee emp= mc.employee.where(w=>w.No=="001").FirstorDefaul();
mc.DeleteObject(emp);
mc.Savechanges();
}
4.修改语法
单笔数据修改:
using(model1Container mc = new model1Container ())
{
employee emp = mc.employee.where(w=>w.No=="001").FirstorDefault();
emp.Name=="Admin";
mc.Savechanges();
}
批量数据修改:
using(model1Container mc = new model1Container ())
{
List<employee> list mc.employee.ToList();
Var query =
from emp in list
where emp.No=="001"
order by emp.id
select emp;
foreach(employee emp in query)
{
if(emp.sex=="女")
{
emp.Sex ='男';
}
}
mc.Savechanges();
}
LinQ to SQL可以用来取代传统的基于SQL语句的查询操作。在以后的数据访问层(DAL)中,我们可以使用LinQ to SQL实现数据库的CRUD操作,在执行的时候.net框架会把LinQ to SQL查询表达式转换成对应的SQL语句再去执行。使用LinQ to SQL可以借助于LinQ语法大大简化我们数据访问的代码量,并且还具有编译检查、智能感知和强类型表达式等优点。
LinQ to SQL从严格意义上来说不能算是一个ORM框架,它只对SQL Server起作用,并不能实现对各种关系型数据库进行透明的映射,所以我们通常把LinQ to SQL称为SQL Mapping框架。 LinQ to SQL都是对Table<TEntity>进行操作,对于“一对多”的关联(如:Customers.Orders)它会使用EntitySets集合类型的成员来表示,而对于“多对一”的关联(如:Order.Customer)它会使用EntityRefs类型成员来表示。LinQ to SQL并不支持“多对多”的直接关联操作。一、LinQ to SQL的ORM
LinQ to SQL不但仅仅实现了对象/关系之间的映射,还提供了一个简单易用的图形化界面工具。通过这个工具可以为SQL200X每个表生成一个实体类,并在底层有关联的表的实体类之间生成一个实体关联,把数据库中表和表之间的“关联关系”彻底转换为对象与对象之间的“关联关系”。通过此关联可以直接访问到该对象和与该对象相关联的其它对象,不用再通过Join子句来实现多表关联查询了。这种关联实体的功能是LinQ和实体框架的重要功能。 这种把数据库中的表和外键封装成类和类之间的关联的优势在于开发人员可以把数据库中的抽象数据设计成现实生活中的对象,依照现实生活中的对象来管理代码世界中的对象数据。使用LinQ to SQL的图形化界面快速实现表与实体之间的映射
1.在项目中添加新项,选择"LinQ to SQL Classes"二、使用LinQ to SQL实现数据库的查询操作
LinQ to SQL的数据库操作是大多数程序员所钟情的功能,因为它能够把LinQ查询表达式自动转换为相应的SQL语句进行处理,这样就不用再花太多的时间去编写实体类和数据访问类了。LinQ to SQL的查询语句与LinQ to Objects语法很相似,只是LinQ to Objects是把LinQ表达式转换为中间语言,而LinQ to SQL是把LinQ表达式转换为SQL语句,送到数据库去执行。 下面以一个简单的例子来展示一下LinQ to SQL的使用,具体语法请参照上一篇文章。 示例: 在Info表中查询回族男生和汉族的女生中姓张的同学的信息 第一步:新建MyDB.dbml,并从服务器资源管理器中把相应的表拖进MyDB.dbml 第二步:添加新页面 第三步:实例化MyDBDataContext对象 MyDBDataContext context = new MyDBDataContext(); 第三步:编写LinQ查询 var q = from p in context.Infos where p.Name.StartsWith("张") &&((p.Nation == "n002" && p.Sex == true) || (p.Nation == "n001" && p.Sex == false) ) select p; 或 var q = context.Infos.Where(p => p.Nation == "n002").Where(p => p.Sex == true).Concat(context.Infos.Where(p => p.Nation == "n001").Where(p => p.Sex == false)).Where(p=>p.Name.StartsWith("张")); 第四步:把查询序列转换成集合,并显示结果 var list = q.ToList(); foreach (Info item in list) { Console.WriteLine(item.Co三、使用LinQ实现增、删、改操作
(一)添加操作 第一步:实例化DataContext对象 MyDBDataContext context = new MyDBDataContext();第二步:生成实体对象
Info da第三步:向DataContext对象的Table<TEntity>集合中注册添加上一步中生成的实体对象
context.Infos.InsertOnSubmit(da第四步:使用DataContext对象提交更改
context.SubmitChanges();(二)修改操作
第一步:实例化DataContext对象 MyDBDataContext context = new MyDBDataContext();第二步:使用DataContext对象查询数据库中需要修改的内容,返回对应的实体对象
Info da第三步:修改上一步中实体对象中的值
da第四步:使用DataContext对象提交更改
context.SubmitChanges();修改数据时,由于要修改的数据本身就是数据库中现有的数据,所以不用像插入操作那样使用context.Infos.InsertOnSubmit(da
(三)删除操作
第一步:实例化DataContext对象 MyDBDataContext context = new MyDBDataContext();第二步:使用DataContext对象查询数据库中需要修改的内容,返回对应的实体对象
Info da第三步:向DataContext对象的Table<TEntity>集合中注册删除上一步中查出的对象
context.Infos.DeleteOnSubmit(da第四步:使用DataContext对象提交更改
context.SubmitChanges();上面的增、删、改查代码只有在context.SubmitChanges()调用的时候才提交数据库执行对应操作。我们可以在执行context.SubmitChanges()之前编写多项数据的增、删、改代码,然后使用context.SubmitChanges()实现一次性提交。context.SubmitChanges()方法自身带有事务功能,我们不必手动编写事务实现数据库的修改。
四、使用LinQ调用存储过程
在开发人员与DBA之间总是存在一种争论:使用在程序中使用存储过程是不是一种较好的解决方案?下面我们从四方面来看一下: 1.访问控制: 如果使用存储过程,可以为数据库创建自定义的用户或角色,并授权他们访问指定的存储过程,以提高数据操作的安全性。2.SQL注入攻击
这种攻击通常是在执行动态SQL语句的时候发生,保存动态SQL语句的变量被恶意用户利用,通过输入的内容与原有SQL语句进行组合形成新的、具有攻击性的语句来对数据库操作。LinQ to SQL使用参数化查询方式来使用动态T-SQL语句,这种参数化的T-SQL语句能够很好的避免SQL注入攻击。所以并不是只有存储过程才能够解决SQL注入攻击。3.性能
在SQL Server6.5或更早版本中,对存储过程可以实现部份编译的功能,当调用存储过程的时候可以加快SQL代码执行速度。在SQL Server7.0和以后的版本中对于存储过程和SQL语句都具有编译功能。因此,一般说来在SQL Server7.0以后的数据库版本,存储过程的执行与参数化的SQL代码执行效率没有什么太大的区别。4.结构独立性
如果数据库的结构发生了变化,那与之相关的存储过程也需要重新编写、测试。如果软件升级时,不但需要重新编写、测试存储过程,还需要涉及到存储过程的更新。如果使用DAL来实现数据库操作的话,可以借助于代码生成工具,来实现数据访问代码的“半自动修改”,使用DAL层可以把数据库结构改变的影响控制在一个有限的局部范围内。(一)添加存储过程
从服务器资源管理器中把存储过程直接拖放到.dbml界面中,在界面的右侧会出现相应的存储过程。(二)使用存储过程实现查询操作
1.把存储过程拖到.dbml界面中去。 2.编写代码调用存储过程(三)使用存储过程实现增、删、改操作
使用存储过程实现增、删、改操作可以有两种方式来实现:一种是使用DataContext对象直接调用存储过程调用方法。另一种是修改实体类的默认方法,把增、删、改操作默认方法指定为相当的存储过程。 第一种方法,使用DataContext对象直接调用存储过程的调用方法 1.把存储过程拖到.dbml界面中去。 2.编写代码调用存储过程第二种方法,修改实体类的默认方法
1.把存储过程拖到.dbml界面中去。 2.在.dbml文件中相应实体类上右击,选择“属性”,打开属性面版。五、使LinQDataSource数据源控件
在Web应用程序中,可以使用数据源控件来向界面提供绑定的数据。LinQ to SQL能够为两种数据源对象提供数据:ObjectDataSource和LinqDataSource。 LinqDataSource控件是VS2008中的新增的数据源控件,它只能绑定到LinQ to SQL的DataContext.Table<TEntity>对象。用它向Web控件提供数据,并可以实现对数据的排序和分页操作。使用GridView、DetailsView、FormView等控件与LinqDataSource控件绑定的时候,不需要编写代码就可以实现数据的插入、修改、删除操作。 ObjectDataSource控件也可以使用LinQ to SQL获取数据,因为DataContext.Table<TEntity>对象实现了IEnumerable<T>接口。当然我们也可以把Table<TEntity>对象转换成其它集合对象实现绑定。 下面我们一起来看一下,如何使用LinQ to SQL来实现数据绑定 第一步:添加LinQ to SQL类文件.dbml,并从“服务器资源管理器”拖动表到.dbml设计界面,生成LinQ to SQL类。 第二步:从工具箱中把LinqDataSource控件拖到界面中来。 第三步:在LinqDataSource控件的智能菜单中单击“配置数据源”,打开配置向导窗口。 第四步:在"Choose your context object"下拉列表中选择***DataContext。点击“Next”。从图20中我们可以看出,表中的数据都被显示出来了,但是“Nation”这一列中显示的是代号,因为这一列是外键列,如何把它显示成民族名称呢。
在上面绑定数据的基础上,继续进行如下设置 第十一步:打开GridView的编辑列对话框。把EntityRef型字段(Nation1)添加到选中列中,再删除原有的Nation绑定列。与延迟加载密切相关的属性有两个:DataContext.DeferredLoadingEnabled和DataContext.LoadOptions
DataContext.DeferredLoadingEnabled:是否采用延迟加载。True-(默认值)采用延迟加载;False-不采用延迟加载(也不采用即时加载,加载的时候只加载当前对象的数据。当我们访问相关联子对象的时候也不会动态加载子对象的数据) DataContext.LoadOptions:加载选项,用来指定那些子对象采用即时加载方式。首先,我们来看看在默认情况下,即“延迟加载”的情况下,DataContext对象的结构:
下面我们再看看“非延迟加载”的情况。
需要大家注意的是:“非延迟加载”并不一定是“即时加载”,它两个不是一个概念。 要实现“非延迟加载”需要把DataContext对象的DeferredLoadingEnabled属性设为False。 然后我们再来看DataContext中的Table<TEntity>的情况:最后我们再来看看“即时加载”,“即时加载”与DataContext.DeferredLoadingEnabled的值没有太大的关系。它主要与DataContext.LoadOptions有关。
“即时加载”就是在加载Info对象的时候不只加载该对象的基本信息,它会把该对象的相关子对象(EntitySet和EntityRef)的数据一起加载出来,而不是等到用到的时候再加载。 下面我们看看如何使用“即时加载”来加载Info对象。注意:对于一个DataContext对象,DataContext.LoadOptions属性只能赋一次值,一旦赋完值,我们将不能修改这个值了。因此,虽然DataLoadOptions提供了灵活的“即时加载”功能,但使用的时候一定要考虑清楚再使用。
附:LinQ的查询管道转载地址:http://gmjab.baihongyu.com/