【问题标题】:How to Track Queries on a Linq-to-sql DataContext如何跟踪 Linq-to-sql DataContext 上的查询
【发布时间】:2023-03-30 07:48:01
【问题描述】:

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

对我来说,这听起来是个好主意。每次加载页面时,我都想知道执行了哪些 sql 语句以及数据库往返总数的计数。 有没有人对这个问题有一个巧妙的解决方案?

您认为可接受的查询数量是多少?我在想,在开发过程中,如果渲染一个页面需要超过 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++;
        }
    }

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

【问题讨论】:

    标签: asp.net linq-to-sql


    【解决方案1】:

    我的博客上有一篇文章涵盖了sending to log files, memory, the debug window or multiple writers

    【讨论】:

      【解决方案2】:
      System.IO.StreamWriter httpResponseStreamWriter = 
      new StreamWriter(HttpContext.Current.Response.OutputStream);
      
      dataContext.Log = httpResponseStreamWriter;
      

      将其粘贴在您的页面中,您将在页面上转储 SQL。显然,我会将它封装在一个可以启用/禁用的小方法中。

      【讨论】:

      • 帮我搞定:Db.Log = Console.Out;
      【解决方案3】:

      来自 Linq 在行动

      Microsoft 有一个 Query Visualizer 工具,可以从 VS 2008 单独下载。它位于 http://weblogs.asp.net/scottgu/archive/2007/07/31/linq-to-sql-debug-visualizer.aspx

      【讨论】:

        【解决方案4】:

        如果你把 .ToString() 放到一个 var 查询变量中,你会得到 sql。您可以在 Debug en VS2008 中使用它。 Debug Visualizer

        例如:

        var query = from p in db.Table
                    select p;
        
        MessageBox.SHow(query.ToString());
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2010-09-23
          • 1970-01-01
          • 2011-07-11
          • 1970-01-01
          • 2011-01-07
          • 1970-01-01
          • 1970-01-01
          • 2012-05-20
          相关资源
          最近更新 更多