2010-02-08 33 views
2

我们可以使用SQL就像这样:如何在LINQ to SQL中使用WITH(NOLOCK)?

SELECT * FROM student WITH(NOLOCK); 

我如何与LINQ实现这一目标而无需使用TransactionScope的到SQL?

+0

你为什么要使用NOLOCK? – 2010-02-08 10:11:13

+0

Ligaoren,我的回答对你有用吗? – Steven 2010-02-08 21:44:19

+0

为什么你不想使用TransactionScope? – KristoferA 2010-02-09 02:02:10

回答

9

LINQ to SQL没有这样做的机制,但是您可以创建具有特定隔离级别的事务。请看下面的代码:

using (var con = new SqlConnection("constr")) 
{ 
    con.Open(); 

    using (var transaction = con.BeginTransaction(
     IsolationLevel.ReadUncommitted)) 
    { 
     using (var context = new SchoolDataContext(con)) 
     { 
      // HACK: Setting the context.Transaction is 
      // needed in .NET 3.5 (fixed in .NET 4.0). 
      context.Transaction = transaction; 
      var q = from s in context.Students select c; 
     } 
    } 
} 

有时使用这种类型的隔离是有用的,即用于性能的原因。但请确保您不使用此类数据库隔离进行任何创建,更新或删除(CUD)操作。这当然取决于你的情况,但你的数据可能会处于不一致的状态。

+0

原谅我迟到的回应,最近是中国春节。 原因部分是历史性的:我的团队成员总是在简单的三层架构中编写nolock语句。他们不想失去对数据库的控制。 他们甚至想在Nhibernate中使用nolock,为此我放弃了Nhibernate。他们并没有完全理解ORM的工作。 现在,我的问题变成如何说服他们使用ORM,而不考虑有关数据访问的细节? – ligaoren 2010-02-21 03:41:15

+0

史提芬的答案很棒 – ligaoren 2010-02-21 03:42:48