Suite à la décision du Roi LinqPad My Extensions
ajout :
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);
}
}
Le dernier signifie que vous pouvez faire un NOLOCK
sur toutes les requêtes d'évaluation que vous n'avez pas un NoLock
explicitement écrit pour (comme je l'ai fait pour ToListNoLock
ci-dessus). Ainsi, par exemple :
somequery.NoLock((x)=>x.Count()).Dump();
évaluera la requête avec NOLOCK
.
Notez que vous devez vous assurer que vous évaluez la requête. Par exemple .NoLock((x)=>x.Distinct()).Count().Dump()
ne fera rien d'utilement différent de .Distinct().Count().Dump()
.
0 votes
Je viens de trouver cette question qui recoupe en partie la mienne, mais je vous en remercie quand même : stackoverflow.com/questions/62963/how-do-you-extend-linq-to-sql Je vais laisser la question ouverte pendant un moment, juste au cas où.