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

如何查看LINQ生成的SQL语句?,linq,Linq,使用ObjectQuery方法是如何完成的?您可以查看,或者将鼠标悬停在Linq to SQL查询上(工具提示应显示生成的SQL),或者访问: context.GetCommand(query).CommandText 您始终可以将某些内容附加到DataContext的.Log属性。这将在发送时显示所有SQL命令 我在数据库中为数据访问对象执行此操作,并将其输出到VisualStudio调试控制台。当对象创建其DataContext时,我检查它是否调试并附加TextWriter帮助程序类,如下

使用ObjectQuery方法是如何完成的?

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

context.GetCommand(query).CommandText

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

我在数据库中为数据访问对象执行此操作,并将其输出到VisualStudio调试控制台。当对象创建其DataContext时,我检查它是否调试并附加TextWriter帮助程序类,如下所示:

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

#if DEBUG
    _dB.Log = new DebugTextWriter();
#endif
以下是用于输出到调试控制台的帮助对象:

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

下面是我使用ObjectQuery方法发现的内容。使用console进行测试,可以执行以下操作:

创建一个扩展方法,如下所示,然后调用它。说Product,然后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;
    }
}
公共静态类MyExtensions
{
公共静态字符串ToTraceString(此iQueryTable t)
{
字符串sql=“”;
ObjectQuery oqt=t作为ObjectQuery;
如果(oqt!=null)
sql=oqt.ToTraceString();
返回sql;
}
}

您可以运行SQL Server探查器

 var q = from img in context.Images
                    ...
         select img;
 string sql = q.ToString();
sql
将包含sql选择查询


编辑:缺点:参数此时将没有任何值

只需一个小更新,您现在可以使用操作来记录SQL:

// test SQL logger
Action<string> SQLLogger = (message) => System.Diagnostics.Debug.Write(message);
_dB.Context().Database.Log = SQLLogger;
//测试SQL记录器
操作SQLLogger=(消息)=>System.Diagnostics.Debug.Write(消息);
_dB.Context().Database.Log=SQLLogger;

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

this.DbContext.Database.Log += s => Debug.WriteLine(s);

如果要对数据库执行linq查询,可以运行SQL探查器来记录正在执行的SQL查询。我们经常这样做是为了确定对转换的任何性能影响。

我还没有尝试过这个GetCommand。我喜欢Scott Gu的链接!Visualizer是内置的Visual Studio 2010吗?@nellbryant:不,它仍然是一个单独的扩展,您需要从VS Gallery中获取它也可以在VS Watch窗口中使用:
((ObjectQuery)myQuery).ToTraceString()
。不错!那么像
Count
这样的聚合方法呢?我认为在使用dbContext时不起作用,因为在这种情况下,您不能将IQueryable强制转换为ObjectQuery。对于那些使用Entity Framework 6 check的人,希望能帮到一些人。您可以使用
context.Log=Console.Out这很简单如果您在本地调试并使用SQL Server,请运行SQL探查器。包含所有参数的查询将显示在那里。如果使用SQL事件探查器,为了确保从VS调试会话捕获所有LINQ查询,请使用SQL事件探查器“RPC Completed”和“SQL:BatchCompleted”事件。