18 Stimmen

Wie erhält man die TSQL-Abfrage von LINQ DataContext.SubmitChanges()

Ich verwende Linq to SQL. Ich habe einen DataContext, gegen den ich SubmitChanges()'ing bin. Beim Einfügen des Identitätsfeldes ist ein Fehler aufgetreten, und ich möchte die Abfrage sehen, mit der dieses Identitätsfeld eingefügt wird.

Ich sehe die Abfrage selbst nicht in der Quickwatch; wo kann ich sie im Debugger finden?

0 Stimmen

Sie können Ihren Datacontext auch so konfigurieren, dass die Abfragen in eine Datei ausgegeben werden.

26voto

Portman Punkte 31245

Viele Leute haben ihren eigenen "DebugWriter" geschrieben und ihn wie folgt angehängt:

// Add this class somewhere in your project...
class DebugTextWriter : System.IO.TextWriter {
   public override void Write(char[] buffer, int index, int count) {
       System.Diagnostics.Debug.Write(new String(buffer, index, count));
   }

   public override void Write(string value) {
       System.Diagnostics.Debug.Write(value);
   }

   public override Encoding Encoding {
       get { return System.Text.Encoding.Default; }
   }
}

// Then attach it to the Log property of your DataContext...
myDataContext.Log = new DebugTextWriter()

Dadurch wird alles, was Linq-to-Sql tut, in das Debug-Fenster von Visual Studio ausgegeben.

12voto

Kev Punkte 115293

Weiter zu Portman's Antwort Wenn Sie eine Konsolenanwendung sind, ist es so einfach wie:

myDataContext.Log = Console.Out;

Oder Sie können so etwas wie Linq2SQL Profiler verwenden, ein hervorragendes Tool, das genau das Richtige für diese Aufgabe ist:

Linq to SQL Profiler - Visueller Echtzeit-Debugger für Linq to SQL

7voto

Taha Rehman Siddiqui Punkte 2281

Es gibt eigentlich eine sehr einfache Antwort auf Ihre Frage

Fügen Sie dies einfach in Ihr Beobachtungsfenster ein

((System.Data.Objects.ObjectQuery)myLinqQueryVar).ToTraceString()

0 Stimmen

Leider klappt das nicht immer. Zum Beispiel il Ihre Abfrage hat eine groupby...

0 Stimmen

Die Antwort hängt viel von Ihrem Entitätsrahmen von der Version 4.1 ab, die Sie den dbcontext haben, der context.Log implementiert, also können Sie die Lösung verwenden, die Sie unten sehen, aber vor dem, wenn Sie Kontext von objectcontext eritate, müssen Sie mit der Lösung oben tun, außer dass unglücklicherweise es nicht immer verwendbar ist

0 Stimmen

Die Antwort war entsprechend der ursprünglich gestellten Frage

3voto

geofftnz Punkte 9606

Führen Sie SQL Profiler aus, wenn Sie ihn haben. Er zeigt den gesamten Datenverkehr mit Ihrer Datenbank an, einschließlich SQL-Befehlstext.

0 Stimmen

SQL Profiler ist aber auch aus anderen Gründen nützlich, z. B. um zu sehen, wie stark Ihr Code die DB belastet.

3voto

Loureiro Punkte 41
FooDataContext dc = new FooDataContext();

StringBuilder sb = new StringBuilder();
dc.Log = new StringWriter(sb);

var result=from r in dc.Tables select d;

.....
string query=sb.ToString();

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X