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

问题描述 投票:0回答:9

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

linq
9个回答
69
投票

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

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

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

31
投票

这是我使用 ObjectQuery 方法找到的内容。使用控制台进行测试,您可以执行以下操作:

创建如下扩展方法,然后调用它。说 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;
    }
}

21
投票

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

context.GetCommand(query).CommandText

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

sql
将包含 sql select 查询。

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


7
投票

您可以运行 SQL Server Profiler。


6
投票

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

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

2
投票

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


1
投票

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

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

0
投票

在 EF Core 5.0 以上版本中,您可以在 IQueryable 上使用 ToQueryString 方法。

public static string ToQueryString(this IQueryable source)

示例:

var sql = context.Blogs
.OrderBy(b => b.BlogId)
.ToQueryString();

您将得到如下所示的结果。

SELECT [b].[BlogId], [b].[Discriminator], [b].[Url], [b].[RssUrl]
FROM [Blogs] AS [b]
ORDER BY [b].[BlogId]
© www.soinside.com 2019 - 2024. All rights reserved.