В дополнение к королю LinqPad My Extensions
дополнение :
public static IQueryable<T> DumpNoLock<T>(this IQueryable<T> query)
{
using (var txn = GetNewReadUncommittedScope())
{
return query.Dump();
}
}
public static System.Transactions.TransactionScope GetNewReadUncommittedScope()
{
return new System.Transactions.TransactionScope(
System.Transactions.TransactionScopeOption.RequiresNew,
new System.Transactions.TransactionOptions
{
IsolationLevel = System.Transactions.IsolationLevel.ReadUncommitted
});
}
public static IQueryable<T> DumpNoLock<T>(this IQueryable<T> query, string description)
{
using (var txn = GetNewReadUncommittedScope())
{
return query.Dump(description);
}
}
public static List<T> ToListNoLock<T>(this IQueryable<T> query)
{
using (var txn = GetNewReadUncommittedScope())
{
return query.ToList();
}
}
public static U NoLock<T,U>(this IQueryable<T> query, Func<IQueryable<T>,U> expr)
{
using (var txn = GetNewReadUncommittedScope())
{
return expr(query);
}
}
Последнее означает, что вы можете выполнить NOLOCK
для любых оценочных запросов, для которых у вас нет явно написанного NoLock
(как у меня для ToListNoLock
выше). Так, например:
somequery.NoLock((x)=>x.Count()).Dump();
оценит запрос с помощью NOLOCK
.
Обратите внимание, что вы должны убедиться, что оцениваете запрос. Например. .NoLock((x)=>x.Distinct()).Count().Dump()
не сделает ничего полезного, отличного от .Distinct().Count().Dump()
.