ちょっと前回の続き。
LINQ to Entities の実行クエリを表示する | Moonmile Solutions Blog
http://www.moonmile.net/blog/archives/1983
マスターページに渡すのに ViewData を使っていたのだが、static なクラスなんだから、そのまま渡してしまってもいい訳です。ViewData を使うと、モデル→コントローラー→ビュー となってモデルで LINQ を定義しているのに、わざわざコントローラーで ViewData に指定しないという手間が発生する訳で。
まずは、LINQ to Entities のクエリを表示するクラスを作ってしまいます。
public static class DebugSQL
{
private static List<string> sqlList = new List<string>();
public static string SQL
{
get
{
string sql = "";
foreach (string s in sqlList)
{
sql += s + "\n";
}
return sql;
}
}
public static List<string> SQLList
{
get {
return sqlList;
}
}
public static string ToTraceString(IQueryable query)
{
var objectQuery = query as ObjectQuery;
if (objectQuery != null)
{
return objectQuery.ToTraceString();
}
else
{
return "no sql;";
}
}
public static void Add(IQueryable query)
{
var objectQuery = query as ObjectQuery;
if (objectQuery != null)
{
sqlList.Add( objectQuery.ToTraceString());
}
}
public static void Clear()
{
sqlList = new List<string>();
}
}
スタティックなクラスにするので、モデルやコントローラーで LINQ を使うところで、こんな風に DebugSQL::Add メソッドを使って追加していきます。
List<CategoryModel> model = new List<CategoryModel>();
var items = from t in ent.wp_terms
where t.wp_term_taxonomy.FirstOrDefault().taxonomy == "category"
select t;
DebugSQL.Add(items);
今回は複数回の呼び出しにも対処しているので、LINQ を使っているところで Add しておけば OK。
そして、マスターページ(Site.Master)
<div id="debug">
<h2>実行クエリ</h2>
<% List<string> sqls = MvcWordpress.Models.DebugSQL.SQLList; %>
<% foreach (var item in sqls) { %>
<%: item%><br />
<% }%>
<% MvcWordpress.Models.DebugSQL.Clear(); %>
</div>
で、こんな風に SQLList プロパティを参照してループで廻して表示します。
こうしておくと、CakePHP のように実行クエリが表示できます。
このすさまじいクエリ(苦笑)を SQL Server Management Studio なんかにコピー&ペーストして使えば、まぁ、なんかが分かるかもってな具合で。
SELECT TOP (10) object_id, ID, post_author, post_date, post_date_gmt, post_content, post_title, post_category, post_excerpt, post_status, comment_status, ping_status, post_password,
post_name, to_ping, pinged, post_modified, post_modified_gmt, post_content_filtered, post_parent, guid, menu_order, post_type, post_mime_type, comment_count
FROM (SELECT Extent1.object_id, Extent3.ID, Extent3.post_author, Extent3.post_date, Extent3.post_date_gmt, Extent3.post_content, Extent3.post_title, Extent3.post_category,
Extent3.post_excerpt, Extent3.post_status, Extent3.comment_status, Extent3.ping_status, Extent3.post_password, Extent3.post_name, Extent3.to_ping, Extent3.pinged,
Extent3.post_modified, Extent3.post_modified_gmt, Extent3.post_content_filtered, Extent3.post_parent, Extent3.guid, Extent3.menu_order, Extent3.post_type,
Extent3.post_mime_type, Extent3.comment_count
FROM wp_term_relationships AS Extent1 INNER JOIN
wp_term_taxonomy AS Extent2 ON Extent1.term_taxonomy_id = Extent2.term_taxonomy_id LEFT OUTER JOIN
wp_posts AS Extent3 ON Extent1.object_id = Extent3.ID
WHERE ('category' = Extent2.taxonomy) AND (Extent2.term_id = @p__linq__0)) AS Project1
ORDER BY post_date DESC
ええ、こちらのクエリの解析は後程。

