如何跟踪Linq-to-sql DataContext上的查询

lia*_*nan 7 asp.net linq-to-sql

在组合代码播客14中,有人提到stackoverflow显示在页面底部的请求期间执行的查询.

这听起来对我来说是个好主意.每次页面加载时我想知道执行什么sql语句以及DB往返总数的计数.有没有人有这个问题的巧妙解决方案?

您认为可接受的查询数量是多少?我在想,在开发期间,如果需要超过30个查询来呈现页面,我可能会让我的应用程序抛出异常.

编辑:我想我一定不能清楚地解释我的问题.在HTTP请求期间,Web应用程序可能会执行十几个或更多sql语句.我希望将这些语句附加到页面底部,以及语句数量的计数.

这是我的解决方案:

我创建了一个DataContext可以写入的TextWriter类:

public class Logger : StreamWriter
    {
        public string Buffer { get; private set; }
        public int QueryCounter { get; private set; }

        public Logger() : base(new MemoryStream())
        {}

        public override void Write(string value)
        {
            Buffer += value + "<br/><br/>";
            if (!value.StartsWith("--")) QueryCounter++;
        }

        public override void WriteLine(string value)
        {
            Buffer += value + "<br/><br/>";
            if (!value.StartsWith("--")) QueryCounter++;
        }
    }
Run Code Online (Sandbox Code Playgroud)

在DataContext的构造函数中,我设置了记录器:

public HeraldDBDataContext()
        : base(ConfigurationManager.ConnectionStrings["Herald"].ConnectionString, mappingSource)
    {
        Log = new Logger();
    }
Run Code Online (Sandbox Code Playgroud)

最后,我使用该Application_OnEndRequest事件将结果添加到页面底部:

protected void Application_OnEndRequest(Object sender, EventArgs e)
    {
        Logger logger = DataContextFactory.Context.Log as Logger;
        Response.Write("Query count : " + logger.QueryCounter);
        Response.Write("<br/><br/>");
        Response.Write(logger.Buffer);
    }
Run Code Online (Sandbox Code Playgroud)

Jed*_*oky 3

如果将 .ToString() 放入 var 查询变量中,您将得到 sql。您可以在 VS2008 的 Debug 中使用它。调试可视化工具

前任:

var query = from p in db.Table
            select p;

MessageBox.SHow(query.ToString());
Run Code Online (Sandbox Code Playgroud)