ちょっと前回の続き。
LINQ to Entities の実行クエリを表示する | Moonmile Solutions Blog
http://www.moonmile.net/blog/archives/1983
マスターページに渡すのに ViewData を使っていたのだが、static なクラスなんだから、そのまま渡してしまってもいい訳です。ViewData を使うと、モデル→コントローラー→ビュー となってモデルで LINQ を定義しているのに、わざわざコントローラーで ViewData に指定しないという手間が発生する訳で。
まずは、LINQ to Entities のクエリを表示するクラスを作ってしまいます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 | 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 メソッドを使って追加していきます。
1 2 3 4 5 | 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)
1 2 3 4 5 6 7 8 | < 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 なんかにコピー&ペーストして使えば、まぁ、なんかが分かるかもってな具合で。
1 2 3 4 5 6 7 8 9 10 11 | 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 |
ええ、こちらのクエリの解析は後程。