在使用LINQ时,使用Sql Server的表提示如“NOLOCK”的方法是什么?
例如,我可以在SQL中编写“SELECT * from employee(NOLOCK)”。
我们如何使用LINQ编写相同的内容?
答案 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提到的技巧。
希望它有所帮助 路加