|
系列文章导航:
不能不说的C#特性-迭代器(下),yield以及流的延迟计算
走进Linq-Linq to SQL How do I(1)
走进Linq-Linq to SQL How do I(2)
走进Linq-Linq to SQL How do I(3)
走进Linq-Linq to SQL源代码赏析 Table
走进Linq-Linq to SQL源代码赏析之Provider的初始化
走进Linq-Linq to SQL源代码赏析,通过Linq to SQL看Linq
最近很忙,真的很忙,所以这个系列好久没更新了,从今天起我又开始了我的走进Linq之旅。Linq to SQL的用法基本上都说完了,还有一些细枝末节的地方需要聊聊。
强类型DataContext
在Linq to SQL的第一篇的时候就说道DataContext是一个入口点,我们使用Linq to SQL做的一些操作几乎都是施加在这个类上的。在使用VS的设计器生成的代码里,我们会看到一个从DataContext继承的局部类,大家都习惯的将这个类称之为强类型的DataContext,她对DataContext做了进一步的封装。
今天我们先就对DataContext一些没有介绍过的地方详细讨论一下。
首先我们先手写一个强类型的DataContext:
强类型的DataContext系列文章导航:
不能不说的C#特性-迭代器(下),yield以及流的延迟计算
走进Linq-Linq to SQL How do I(1)
走进Linq-Linq to SQL How do I(2)
走进Linq-Linq to SQL How do I(3)
走进Linq-Linq to SQL源代码赏析 Table
走进Linq-Linq to SQL源代码赏析之Provider的初始化
走进Linq-Linq to SQL源代码赏析,通过Linq to SQL看Linq
在DataContext还有几个我们比较感兴趣的方法:
ExecuteCommand,ExecuteQuery<TResult>,Translate
这几个方法都是为了和传统的ADO.NET集成的。
ExecuteCommand可以做insert,update,delete操作,第一个参数接受一个格式化的sql语句,第二个参数是参数数组:
使用起来很简单:
dbCtx.ExecuteCommand("insert into posts(blogid,title,body) values({0},{1},{2})", "2", "走进Linq-How do I(4)", "废话一篇");
ExecuteQuery<TResult>方法呢?顾名思义,就是执行查询的,也有两个参数,第一个接受查询的SQL语句,第二个接受参数,返回一个IEnumerable<T>对象:
IEnumerable<Post> posts = dbCtx.ExecuteQuery<Post>("select * from posts where postid = {0}", "1");
foreach (var post in posts)
Console.WriteLine(post.Title);
Translate方法是将以前的DataReader转换为现在的Linq to SQL方式,这样有什么好处呢:
1. 可以利用现在的映射,不再需要这样的语句post.Title = dr[1].ToString();
2. 可以使用查询表达式的语法
对于插入,更新,删除这些经常使用的操作,为了提高性能,或者做一些自定义的操作,你还可以覆盖微软默认为你提供的Insert,Update等方法:
1. 写一个存储过程
CREATE PROCEDURE dbo.CreatePost
(
@blogid int,
@title nvarchar(50),
@body nvarchar(500)
)
AS
insert into posts(blogid,title,body) values(@blogid,@title,@body)
RETURN
当然,这个存储过程非常简单,不值得这么去做,你就假设存在一个复杂的存储过程
2. 把Posts表拖到设计器上,上面的存储过程拖到方法设计器上
3. 右键点击设计器上的表,在右键菜单里会有一项:配置行为(Config Behavior):
系列文章导航:
不能不说的C#特性-迭代器(下),yield以及流的延迟计算
走进Linq-Linq to SQL How do I(1)
走进Linq-Linq to SQL How do I(2)
走进Linq-Linq to SQL How do I(3)
走进Linq-Linq to SQL源代码赏析 Table
走进Linq-Linq to SQL源代码赏析之Provider的初始化
走进Linq-Linq to SQL源代码赏析,通过Linq to SQL看Linq
这样就可以用你自定义的存储过程做插入操作了。
Linq to SQL中的事务
事务这个东西在并发的时候特别重要,Linq to SQL本身就支持事务,不过是乐观锁。我们也可以显式的启动Linq to SQL的事务。
dbCtx.Transaction = dbCtx.Connection.BeginTransaction();
try
{
dbCtx.ExecuteCommand("insert into posts(blogid,title,body) values({0},{1},{2})", "2", "走进Linq-How do I(4)", "废话一篇");
dbCtx.ExecuteCommand("insert into posts(blogid,title,body) values({0},{1},{2})", "3", "走进Linq-How do I(5)", "废话两篇");
dbCtx.Transaction.Commit();
}
catch
{
dbCtx.Transaction.Rollback();
}
DbConnection的BeginTransaction方法还可以接受一个枚举参数IsolationLevel,来指定事务隔离的级别。
对于那些多个DataContext之间的事务,我们可以使用.NET 2.0引入的TransactionScope
下一篇谈谈RowVersion的问题
it知识库:走进Linq-How do I(4)拾遗补零篇第一节,转载需保留来源!
郑重声明:本文版权归原作者所有,转载文章仅为传播更多信息之目的,如作者信息标记有误,请第一时间联系我们修改或删除,多谢。