LINQ to Entities の実行クエリを表示する(続)

ちょっと前回の続き。

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

ええ、こちらのクエリの解析は後程。

カテゴリー: ASP.NET パーマリンク