2017-01-01 3 views
0

ANTSなどの類似の代替エンティティのようなEntity Frameworkプロファイラを使用し始めました。プロファイラが分析された後、Entity Frameworkによって生成されたSQLクエリ形式のすべてのEntity Frameworkボトルネックが一覧表示されます。しかし、私はコード内のどのクエリを追跡することができません。そのSQLクエリを実行するコードの行を知ることは可能ですか?エンティティフレームワークのSQLコードを確認する

+0

あなたのコードにすべてのLinq(SQL GENERATED)クエリを記録することができます。これをファイルに記録することができます –

答えて

1

私はANTSにこれをさせることはできません(Redgateのみ)。

ただし、プロファイリング時または非プロファイリング時に、ログActionをコンテキストのDatabase.Logプロパティに添付することで、すべてのSQL文を常にログできます。

このロギングアクションで

、あなたはまた、その時点でのスタックトレースをログに記録して、デバッグログで報告されたSQLのボトルネックを見つけることを試みること:

using (var db = new MyContext()) 
{ 
    db.Database.Log = s => 
    { 
     Debug.WriteLine(s); 
     if (s.StartsWith("SELECT")) 
      Debug.WriteLine("\nStack trace:\n" + 
       string.Join("", new StackTrace(3).GetFrames().ToList())); 
    }; 
    // LINQ statements here. 
} 

私が使用するいくつかのコメント

  • new StackTrace(3)は、ロギングプロセス自体をカバーする最初の数フレームをスキップします。スタックトレースのどこかに、ログに記録されたSQL文を起動したC#メソッドがあります。
  • これは、SELECTコマンドのスタックトレースのみを記録します。通常、それらは分析したいものです。

コンテキストファクトリからコンテキストインスタンスを取得して、このロギングコードを1回だけ書き込むことをお勧めします。ログのアクションを条件付きでif DEBUGコンパイラ指令で追加することができます。

関連する問題