2009-03-12 17 views
13

Estoy utilizando Linq para SQL. Tengo un DataContext contra el cual soy .SubmitChanges() 'ing. Hay un error al insertar el campo de identidad, y me gustaría ver la consulta que está usando para insertar este campo de identidad.Cómo obtener la consulta de TSQL de LINQ DataContext.SubmitChanges()

No veo la consulta en sí dentro del reloj; ¿Dónde puedo encontrarlo desde el depurador?

+0

También puede configurar su DataContext a la salida de las consultas en un archivo . – eglasius

Respuesta

8

realidad, hay una respuesta muy simple a su pregunta

basta con pegar esto en su ventana de inspección

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

lamentablemente eso no siempre funciona. Por ejemplo, tu consulta tiene un grupo por ... – bobzer

+0

¿Estás seguro de que lo has intentado para linqtosql? –

+0

la respuesta depende mucho de la estructura de su entidad desde la versión 4.1 usted tiene el dbcontext que implementa context.Log para que pueda usar la solución que se ve a continuación, pero antes si contextualiza heritate desde objectcontext tiene que ver con la solución anterior excepto que lamentable no siempre es utilizable – bobzer

3

Ejecute el Analizador de SQL si lo tiene. Mostrará todo el tráfico a su base de datos, incluido el texto de comando SQL.

+0

Gracias; eso funciona. Sin embargo, esperaba verlo de VS. – tsilb

+0

SQL Profiler también es útil por otras razones, por ejemplo: ver la carga que su código está poniendo en el DB. – geofftnz

20

Hay mucha gente que han escrito su propia "DebugWriter" y lo conecta de esta manera:

salida de todo
// 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() 

Esta voluntad que LINQ to SQL está haciendo en la ventana de depuración de Visual Studio.

0

Acepto que Linq to SQL Profiler es la herramienta adecuada para este trabajo. Pero si no quiere gastar el dinero o simplemente necesita hacer algo simple, me gusta el enfoque DebugTextWriter.

Después de leer esta pregunta, salí en busca de algo más sólido. Resulta que Damien Guard también se ocupó de wrote a very nice article para crear diferentes escritores para que se ocupen de cosas diferentes, como la salida a memoria, depuración, un archivo, múltiples destinos o incluso el uso de simples delegados.

terminé usando un par de sus ideas y escribir un ActionTextWriter que puede manejar más de un delegado, y pensé que iba a compartir aquí:

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); 
      } 
     } 
    } 
} 

Puede añadir tantas acciones como desee . En este ejemplo se escribe en un archivo de registro y la consola en Visual Studio a través de 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); 

Y por supuesto, si usted quiere hacer más simples de usar fruto de la casualidad, siempre se puede extender ActionTextWriter .. . escribir el enfoque genérico y la reutilización, ¿verdad?

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