如何在Linq-to-SQL DataContext中跟踪查询

7
在第14期herding code播客中,有人提到stackoverflow在页面底部显示了执行请求期间执行的查询。这对我来说听起来像是一个很好的主意。每次加载页面时,我都想知道执行了哪些SQL语句以及DB往返的总数。有没有人对此问题有一个简洁的解决方案?
你认为一个可接受的查询数量是多少?我想在开发过程中,如果需要超过30个查询才能呈现页面,我的应用程序会抛出异常。
编辑:我认为我可能没有清楚地解释我的问题。在HTTP请求期间,Web应用程序可能会执行十几个或更多的SQL语句。我希望将这些语句附加到页面底部,并计算语句的数量。
以下是我的解决方案:
我创建了一个TextWriter类,DataContext可以写入其中:
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++;
        }
    }

在 DataContext 的构造函数中,我设置了日志记录器:
public HeraldDBDataContext()
        : base(ConfigurationManager.ConnectionStrings["Herald"].ConnectionString, mappingSource)
    {
        Log = new Logger();
    }

最后,我使用 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);
    }
4个回答

3
如果将.ToString()应用于var查询变量,您将获得SQL。您还可以在Debug en VS2008中使用此功能。 调试可视化工具 例如:
var query = from p in db.Table
            select p;

MessageBox.SHow(query.ToString());

3
System.IO.StreamWriter httpResponseStreamWriter = 
new StreamWriter(HttpContext.Current.Response.OutputStream);

dataContext.Log = httpResponseStreamWriter;

将以下代码添加到您的页面中,您将在页面上获得SQL转储结果。显然,我会将其包装在一个可启用/禁用的小方法中。
把那段放进你的页面里,就可以在页面上看到SQL转储出来的结果了。当然,我会给它包装成一个小方法,方便启用或者禁用。

帮助我实现了:Db.Log = Console.Out; - Haroon

1

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接