如何在使用LINQ时使用SQL Server表提示?

时间:2010-11-05 08:14:50

标签: sql-server linq linq-to-sql ado.net transactions

在使用LINQ时,使用Sql Server的表提示如“NOLOCK”的方法是什么?

例如,我可以在SQL中编写“SELECT * from employee(NOLOCK)”。

我们如何使用LINQ编写相同的内容?

2 个答案:

答案 0 :(得分:2)

以下是您如何申请NOLOCK:http://www.hanselman.com/blog/GettingLINQToSQLAndLINQToEntitiesToUseNOLOCK.aspx

(引用后人,斯科特先生保留所有权利):

ProductsNewViewData viewData = new ProductsNewViewData();
using (var t = new TransactionScope(TransactionScopeOption.Required,
    new TransactionOptions { 
        IsolationLevel = System.Transactions.IsolationLevel.ReadUncommitted 
    }))
{
   viewData.Suppliers = northwind.Suppliers.ToList();
   viewData.Categories = northwind.Categories.ToList();
}

答案 1 :(得分:1)

我强烈建议在使用ReadUncommitted之前阅读有关SQL Server事务隔离模式的信息。 这是一个非常好的阅读

http://blogs.msdn.com/b/davidlean/archive/2009/04/06/sql-server-nolock-hint-other-poor-ideas.aspx

在许多情况下,等级ReadSnapshot就足够了。您是否真的需要它您可以使用

为您的数据库设置默认事务隔离级别
Set Transaction Isolation Level --levelHere

其他好的想法包括将您的上下文打包在一个包装器中,该包装器使用所需的隔离级别封装每个调用。 (也许你需要95%的时间nolock和5%的时间可序列化)。它可以使用扩展方法完成,也可以通过以下代码执行常规方法:

viewData.Categories = northwind.Categories.AsReadCommited().ToList();

这需要你的IQueryable和Rob提到的技巧。

希望它有所帮助 路加