2011-02-04 15 views

Respuesta

23

Aquí está lo que encontré usando el método ObjectQuery. Con la consola para probar, puede hacer lo siguiente:

Cree un Método de extensión como se indica a continuación y llámelo. Diga Product product, luego SQL imprime como product.ToTraceString.

public static class MyExtensions 
{ 
    public static string ToTraceString<T>(this IQueryable<T> t) 
    { 
     string sql = ""; 
     ObjectQuery<T> oqt = t as ObjectQuery<T>; 
     if (oqt != null) 
      sql = oqt.ToTraceString(); 
     return sql; 
    } 
} 
+5

Se puede usar en la ventana VS Watch también: '((ObjectQuery) myQuery) .ToTraceString()'. ¡Buena esa! – icebat

+0

¿Qué pasa con los métodos agregados como 'Count'? –

+5

No creo que funcione cuando se usa dbContext ya que no se puede convertir IQueryable en ObjectQuery en este caso. – NER1808

18

Puede usar LINQPad para eso.

+0

Dicen que es el uso de la Método ObjectQuery o Analizador de SQL. ¿Cómo lo hace programáticamente en una consola, por ejemplo? – nellbryant

+1

No estoy seguro de haber entendido la última pregunta ... Al menos, para responder la pregunta en su título, "Cómo ver las sentencias SQL generadas de LINQ": LINQPad tiene una ventana de salida donde puede seleccionar "Resultados", "Lambda" o "SQL". –

+0

¡Eh, esa es una buena herramienta de código abierto !. Gracias. – nellbryant

13

Se puede echar un vistazo a la Linq-to-SQL Debug Visualizer, o simplemente colocar el ratón sobre la consulta LINQ a SQL (información sobre herramientas debe mostrar el SQL generado), o acceso:

context.GetCommand(query).CommandText 
+0

Todavía no he probado GetCommand. Me gusta el enlace de Scott Gu! ¿Visualizer 2010 está integrado en Visualizer? – nellbryant

+0

@nellbryant: no, sigue siendo una extensión separada que debe obtener de la galería VS –

50

Siempre se puede colocar algo para la propiedad .Log de su DataContext. Eso mostrará todos los comandos SQL a medida que se envían.

Hago esto en mi base para objetos de acceso a datos y lo envío a la consola de depuración de Visual Studio. Como los objetos crean su DataContext puedo comprobar que ver si su depuración y adjuntar una clase TextWritter ayudante de la siguiente manera:

dbDataContext _dB = new dbDataContext(); 
_dB.CommandTimeout = 5000; 

#if DEBUG 
    _dB.Log = new DebugTextWriter(); 
#endif 

Aquí es el objeto de ayuda para la salida de la consola de depuración:

//utility class for output of TextWriter for the Visual Sudio Debug window 
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; } 
    } 
} 
+2

Para quienes usan ** Entity Framework 6 **, compruebe [this] (http://stackoverflow.com/a/20751723/2218697) , la esperanza ayuda a alguien – stom

5

Puede ejecutar el Analizador de SQL Server.

14
var q = from img in context.Images 
        ... 
     select img; 
string sql = q.ToString(); 

sql contendrá la consulta de selección sql.

EDIT: Desventaja: parámetros no tendrán ningún valor en este momento

+1

Si está depurando localmente y usando SQL Server, ejecute el Analizador de SQL. La consulta con todos los parámetros aparecerá allí. – Rich

0

sólo una pequeña actualización, ahora puede usar una acción para registrar el SQL:

// test SQL logger 
Action<string> SQLLogger = (message) => System.Diagnostics.Debug.Write(message); 
_dB.Context().Database.Log = SQLLogger; 
Cuestiones relacionadas