Ist es möglich, Linq2Sql dazu zu bringen, einen NOLOCK in seiner SQL auszugeben? Und wenn ja, wie?
linq-to-sql
Scott McKenzie
quelle
quelle
Antworten:
Ja, also hier ist der Eintrag aus meinem Blog :
Hier sind die ersten Ergebnisse einer Google-Suche nach "linq sql nolock":
InfoQ: Implementierung von NOLOCK mit LINQ to SQL und LINQ to Entities
Matt Hamilton - LINQ zu SQL und NOLOCK Hinweise: Mad Props!
Scott Hanselmans Computer Zen - LINQ zu SQL und LINQ zu ...
quelle
Weiter zum LinqPad- Zusatz des Königs
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); } }
Letzteres bedeutet, dass Sie
NOLOCK
alle auswertenden Abfragen durchführen können, für die Sie nichtNoLock
explizit geschrieben haben (wieToListNoLock
oben beschrieben). Also zum Beispiel:somequery.NoLock((x)=>x.Count()).Dump();
wird die Abfrage mit auswerten
NOLOCK
.Beachten Sie, dass Sie sicherstellen müssen, dass Sie die Abfrage auswerten. ZB
.NoLock((x)=>x.Distinct()).Count().Dump()
macht nichts sinnvoll anderes als.Distinct().Count().Dump()
.quelle
Eine einfache Möglichkeit besteht darin, einen Befehl für Ihre DataContext-Klasse auszuführen
using (var dataContext = new DataContext()) { dataContext.ExecuteCommand("SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED"); // Your SQL query }
quelle
Hier ist eine Erweiterungsmethode für LINQPAD
public static IQueryable<T> Dump2<T>(this IQueryable<T> query) { using (var txn = new System.Transactions.TransactionScope(TransactionScopeOption.RequiresNew, new TransactionOptions { IsolationLevel = System.Transactions.IsolationLevel.ReadUncommitted })) { return query.Dump(); } }
Dann können Sie es nennen als:
MyTable.Where(t => t.Title = "Blah").Dump2();
quelle
In meinem Fall Entity Framework 5 (basierend auf der Antwort von @Soppus):
private FoobarEntities db = new FoobarEntities(); public FoobarController() { db.Database.ExecuteSqlCommand("SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED"); }
quelle