如何查看LINQ生成的SQL语句?

nel*_*ant 52 linq

如何使用ObjectQuery方法完成?

Tj *_*lie 55

您始终可以将某些内容附加到DataContext的.Log属性.这将显示发送时的所有SQL命令.

我在我的数据访问对象基础上执行此操作并将其输出到Visual Studio调试控制台.当对象创建他们的DataContext时,我检查它是否调试并附加一个TextWritter助手类,如下所示:

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

#if DEBUG
    _dB.Log = new DebugTextWriter();
#endif
Run Code Online (Sandbox Code Playgroud)

这是输出到调试控制台的辅助对象:

//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; }
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 对于那些使用**实体框架6**检查[this](http://stackoverflow.com/a/20751723/2218697),希望帮助某人. (5认同)
  • 你可以只使用 `context.Log = Console.Out;` 它更简单 (4认同)

nel*_*ant 26

这是我使用ObjectQuery方法发现的.使用控制台进行测试,您可以执行以下操作:

创建一个扩展方法,如下所示,然后调用它.说产品产品,然后SQL打印出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;
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 我不认为在使用dbContext时工作,因为在这种情况下你不能将IQueryable <T>强制转换为ObjectQuery <T>. (6认同)
  • 它也可以在VS Watch窗口中使用:`((ObjectQuery)myQuery).ToTraceString()`.好一个! (5认同)

Ola*_*gen 20

您可以使用LINQPad.


gyo*_*dor 17

 var q = from img in context.Images
                    ...
         select img;
 string sql = q.ToString();
Run Code Online (Sandbox Code Playgroud)

sql 将包含sql选择查询.

编辑:缺点:此时参数不会有任何值

  • 如果您在本地调试并使用 SQL Server,请运行 SQL Profiler。带有所有参数的查询将显示在那里。 (2认同)

mar*_*c_s 15

您可以查看Linq-to-SQL Debug Visualizer,或者只是将鼠标悬停在Linq-to-SQL查询上(工具提示应显示生成的SQL),或访问:

context.GetCommand(query).CommandText
Run Code Online (Sandbox Code Playgroud)


use*_*167 6

这是我在设置数据库上下文时使用的:

this.DbContext.Database.Log += s => Debug.WriteLine(s);
Run Code Online (Sandbox Code Playgroud)


gui*_*mie 5

您可以运行SQL Server Profiler.