首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> ASP.NET 基礎 >> 關於ASP.NET

ASP.NET 中顯示 Linq to SQL 生成的 SQL 語句

     編輯:關於ASP.NET

調優 Linq to SQL 必須查看生成的 SQL。桌面程式用 `Console.Out`,Web 程式可用 `StringWriter` 攔截輸出。

輔助類:LogHelper

using System.IO;
using System.Text;

namespace Clowwindy.Models
{
    public static class LogHelper
    {
        public static StringBuilder Log = new StringBuilder();
        public static TextWriter Writer = new StringWriter(Log);

        public static string GetLog()
        {
            Writer.Flush();
            return Log.ToString();
        }

        public static void Clear()
        {
            Log.Clear();
            Writer = new StringWriter(Log);
        }
    }
}

使用方式

protected void Page_Load(object sender, EventArgs e)
{
    using (var db = new MyDataContext())
    {
        db.Log = LogHelper.Writer; // 關鍵:導向我們的 StringWriter

        var q = from c in db.Customers
                where c.City == "Taipei"
                select c;
        var list = q.ToList(); // 執行查詢

        // 取得 SQL
        string sql = LogHelper.GetLog();
        LogHelper.Clear(); // 避免下次請求累積

        litSql.Text = sql.Replace("\n", "<br/>"); // 顯示在頁面
    }
}

進階:MiniProfiler 整合

// Global.asax
protected void Application_BeginRequest()
{
    MiniProfiler.Start();
}
protected void Application_EndRequest()
{
    MiniProfiler.Stop();
}

// 頁面/Controller
var profiler = MiniProfiler.Current;
using (profiler.Step("Linq Query"))
{
    var data = db.Customers.Where(c => c.City == "Taipei").ToList();
}

MiniProfiler 會自動攔截 `DbCommand`,在頁面左上角顯示 SQL、耗時、參數、堆疊追蹤,強烈推薦生產環境使用。

注意

  • `DataContext.Log` 僅在查詢**執行時**(如 `ToList()`、`Count()`、`foreach`)輸出 SQL。
  • 併發請求下 `static StringBuilder` 會串聯,實務上應用 `ThreadLocal`、`AsyncLocal` 或每請求 `new` 一份。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved