代码之家  ›  专栏  ›  技术社区  ›  liammclennan

如何跟踪Linq到sql DataContext的查询

  •  7
  • liammclennan  · 技术社区  · 17 年前

    在the herding code 播客14有人提到,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 回复  |  直到 10 年前
        1
  •  3
  •   Jedi Master Spooky    17 年前

    如果你放。ToString()到一个var查询变量,你会得到sql。您可以在调试en VS2008中使用此功能。 Debug Visualizer

    前任:

    var query = from p in db.Table
                select p;
    
    MessageBox.SHow(query.ToString());
    
        2
  •  3
  •   FlySwat    17 年前
    System.IO.StreamWriter httpResponseStreamWriter = 
    new StreamWriter(HttpContext.Current.Response.OutputStream);
    
    dataContext.Log = httpResponseStreamWriter;
    

    把它放在你的页面上,你会把SQL转储到页面上。显然,我会用一个可以启用/禁用的小方法来包装它。

        3
  •  1
  •   DamienG    17 年前

    我在博客上有一篇文章,内容涵盖 sending to log files, memory, the debug window or multiple writers .

        4
  •  0
  •   David Basarab    17 年前

    林在行动

    微软有一个查询可视化工具,可以从VS 2008单独下载。它在 http://weblogs.asp.net/scottgu/archive/2007/07/31/linq-to-sql-debug-visualizer.aspx