linq杂记
1 首先来谈谈Translate的用法。这个方法主要是来代替以前的DataReader,大多是用于扩展用的。
比如说:你要一个IN搜索的,就可以用这个来扩展。 当然。LINQ中现在已经有了IN的代替品。不需要用这个东西来扩展了。
Translate方法并不会直接生成所有的对象,而是在外部代码访问Translate方法返回的IEnmuerable<T>时才会生成其中每个对象。这也是一种Lasy Load,但是也导致了所有的对象必须在Reader对象关闭之前生成,所以我一般都会在Translate方法后直接调用ToList方法,保证所有的对象已经生成了。虽然事实上我们也可以不使用using关键字而直接返回Translate方法生成的IEnumerable<Item>,不过这么做的话当前链接就得不到释放(释放,而不是关闭)
2 Linq to SQL中的事务(转载于横刀天笑的BLOG)
事务这个东西在并发的时候特别重要,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