Как использовать подсказки таблиц SQL Server при использовании LINQ? - PullRequest
1 голос
/ 05 ноября 2010

Как использовать табличные подсказки Sql Server, такие как «NOLOCK», при использовании LINQ?

Например, я могу написать «SELECT * from employee (NOLOCK)» в SQL.

Как мы можем написать то же самое, используя LINQ?

Ответы [ 2 ]

2 голосов
/ 05 ноября 2010

Вот как вы можете применить 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 голос
/ 05 ноября 2010

Я настоятельно рекомендую прочитать о режимах изоляции транзакций SQL Server перед использованием ReadUncommitted.Вот очень хорошее чтение

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

Во многих случаях достаточно уровня ReadSnapshot.Также вам, если вам это действительно нужно. Вы можете установить уровень изоляции транзакции по умолчанию для своей базы данных, используя

Set Transaction Isolation Level --levelHere

Другие хорошие идеи включают упаковку вашего контекста в оболочку, которая инкапсулирует каждый вызов с использованием требуемого уровня изоляции.(может быть, вам нужно nolock 95% времени и сериализуемый 5% времени).Это можно сделать с помощью методов расширения или обычных методов с помощью кода, подобного следующему:

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

, который принимает ваш IQueryable и выполняет трюк, упомянутый Робом.

...