关于asp.net:如何在Linq-to-sql DataContext上跟踪查询

关于asp.net:如何在Linq-to-sql DataContext上跟踪查询

How to Track Queries on a Linq-to-sql DataContext

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

在我看来,这是个好主意。每次页面加载时,我想知道执行了哪些sql语句,还想知道数据库往返的总数。
有没有人对这个问题有一个很好的解决方案?

您认为可接受的查询数量是多少?我当时在想,在开发过程中,如果要渲染一个页面需要30个以上的查询,我的应用程序可能会抛出异常。

编辑:我想我一定不能清楚地解释我的问题。在HTTP请求期间,Web应用程序可能执行一打或更多的sql语句。我想将这些语句附加到页面底部,并附上语句数量的计数。

这是我的解决方案:

我创建了一个TextWriter类,DataContext可以将其写入:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
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的构造函数中,我设置了记录器:

1
2
3
4
5
public HeraldDBDataContext()
        : base(ConfigurationManager.ConnectionStrings["Herald"].ConnectionString, mappingSource)
    {
        Log = new Logger();
    }

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

1
2
3
4
5
6
7
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);
    }

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

dataContext.Log = httpResponseStreamWriter;

将其保留在页面中,即可将SQL转储到页面上。显然,我将其package成一个可以启用/禁用的小方法。


如果将.ToString()放入var查询变量,则会得到sql。您也可以在VS2008调试中使用它。调试Visualizer

例如:

1
2
3
4
var query = from p in db.Table
            select p;

MessageBox.SHow(query.ToString());

我的博客上有一篇文章,内容涉及发送到日志文件,内存,调试窗口或多个编写器。


来自Linq in Action

Microsoft has a Query Visualizer tool that can be downloaded separetly from VS 2008. it is at http://weblogs.asp.net/scottgu/archive/2007/07/31/linq-to-sql-debug-visualizer.aspx


推荐阅读