2009-03-12 5 views
13

Ich verwende Linq zu SQL. Ich habe einen DataContext, gegen den ich .SubmitChanges() 'ing bin. Beim Einfügen des Identitätsfelds ist ein Fehler aufgetreten, und ich möchte die Abfrage sehen, mit der dieses Identitätsfeld eingefügt wird.So erhalten Sie die TSQL-Abfrage von LINQ DataContext.SubmitChanges()

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

+0

Sie auch Ihre Datacontext zur Ausgabe der Abfragen in einer Datei konfigurieren können . – eglasius

Antwort

8

Es ist eigentlich eine sehr einfache Antwort auf Ihre Frage

Nur dieses Fenster in Ihrer Uhr einfügen

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

Leider funktioniert das nicht immer. Zum Beispiel il Ihre Abfrage hat eine groupby ... – bobzer

+0

Sind Sie sicher, dass Sie es für linqtosql versucht? –

+0

Die Antwort hängt viel von Ihrem Entity-Framework ab der Version 4.1 Sie haben den dbcontext, der context.Log implementiert, so dass Sie die unten gezeigte Lösung verwenden können, aber vorher, wenn Sie Kontext von objectcontext herleiten, müssen Sie mit der obigen Lösung tun außer dass es nicht immer brauchbar ist – bobzer

3

Führen Sie SQL Profiler, wenn Sie es haben. Es wird der gesamte Datenverkehr zu Ihrer Datenbank angezeigt, einschließlich SQL-Befehlstext.

+0

Danke; das funktioniert. Ich hoffte jedoch, es von VS zu sehen. – tsilb

+0

SQL Profiler ist auch aus anderen Gründen nützlich, zB: Wenn Sie sehen, dass der Code geladen wird, wird die DB angelegt. – geofftnz

20

Viele Menschen haben ihre eigenen "DebugWriter" zu schreiben und es wie so angebracht:

// 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() 

Dies wird alles ausgeben, die Linq-to-Sql ist Visual Studio Debug-Fenster tun in.

0

Ich stimme zu, dass Linq zu SQL Profiler das richtige Werkzeug für diesen Job ist. Aber wenn Sie das Geld nicht ausgeben oder einfach etwas Einfaches tun wollen, mag ich den DebugTextWriter Ansatz.

Nachdem ich diese Frage gelesen hatte, machte ich mich auf die Suche nach etwas robusterem. Es stellt sich heraus, Damien Guard auch wrote a very nice article über den Aufbau verschiedener Autoren mit verschiedenen Dingen wie die Ausgabe zu Speicher, Debug, eine Datei, mehrere Ziele oder sogar mit einfachen Delegaten.

gewickelt ich mit ein paar seiner Ideen und eine ActionTextWriter schreiben, die mehr als einen Delegierten umgehen kann, und ich dachte, dass ich es teilen würde hier:

using System; 
using System.Collections.Generic; 
using System.IO; 
using System.Text; 

namespace Writers 
{ 
    public class ActionTextWriter : TextWriter 
    { 
     protected readonly List<Action<string>> Actions = new List<Action<string>>(); 

     public ActionTextWriter(Action<string> action) 
     { 
      Actions.Add(action); 
     } 

     public ActionTextWriter(IEnumerable<Action<string>> actions) 
     { 
      Actions.AddRange(actions); 
     } 

     public ActionTextWriter(params Action<string>[] actions) 
     { 
      Actions.AddRange(actions); 
     } 

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

     public override void Write(char[] buffer, int index, int count) 
     { 
      Write(new string(buffer, index, count)); 
     } 

     public override void Write(char value) 
     { 
      Write(value.ToString()); 
     } 

     public override void Write(string value) 
     { 
      if (value == null) 
      { 
       return; 
      } 

      foreach (var action in Actions) 
      { 
       action.Invoke(value); 
      } 
     } 
    } 
} 

Sie können so viele Aktionen wie Sie wollen . Dieses Beispiel schreibt in eine Protokolldatei und die Konsole in Visual Studio über Debug.Write:

// Create data context 
var fooDc = new FooDataContext(); 

// Create writer for log file. 
var sw = new StreamWriter(@"C:\DataContext.log") {AutoFlush = true}; 

// Create write actions. 
Action<string> writeToDebug = s => Debug.Write(s); 
Action<string> writeToLog = s => sw.Write(s); 

// Wire up log writers. 
fooDc.Log = new ActionTextWriter(writeToDebug, writeToLog); 

Und natürlich, wenn Sie wollen einfachere, um die Manschette zu verwenden, aus, können Sie immer ActionTextWriter erweitern .. Schreiben Sie den generischen Ansatz und wiederverwenden, oder?

using System.Diagnostics; 
using System.IO; 

namespace Writers 
{ 
    public class TraceTextWriter : ActionTextWriter 
    { 
     public TraceTextWriter() 
     { 
      Actions.Add(s => Trace.Write(s)); 
     } 
    } 

    public class FileTextWriter : ActionTextWriter 
    { 
     public FileTextWriter(string path, bool append = false) 
     { 
      var sw = new StreamWriter(path, append) {AutoFlush = true}; 
      Actions.Add(sw.Write); 
     } 
    } 
} 
1
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(); 
Verwandte Themen