調優 Linq to SQL 必須查看生成的 SQL。桌面程式用 `Console.Out`,Web 程式可用 `StringWriter` 攔截輸出。
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/>"); // 顯示在頁面
}
}
// 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、耗時、參數、堆疊追蹤,強烈推薦生產環境使用。