15

「コードのみ」モードでEntityFrameworkCTP5を使用しています。クエリの実行速度が非常に遅いため、データベースから返されたオブジェクトに対してLINQクエリを実行しています。クエリから生成されているSQLステートメントを取得する方法はありますか?

Topic currentTopic =
    (from x in Repository.Topics
     let isCurrent = (x.StoppedAt <= x.StartedAt || (x.StartedAt >= currentTopicsStartedAtOrAfter))
     where x.Meeting.Manager.User.Id == user.Id && isCurrent
     orderby x.StartedAt descending
     select x).FirstOrDefault();

「リポジトリ」プロパティは、DbContextの子孫です。

EFはオブジェクトに対してヘルパーメソッドを使用できないため、少し複雑です。そのため、クエリでロジックを直接指定しています。

それで、そのLINQクエリによって生成されるSQLを(たとえば、log4netリポジトリに)ダンプする方法はありますか?

4

5 に答える 5

19

ここで説明されているように、 Entity Frameworkトレースプロバイダーを使用してみることができます(ただし、CTP3の古い投稿です)。

他の選択肢は次のとおりです。

一般的なEFでは、@ Andyが提案したように使用することもできますToTraceStringDbQuery、CodeFirstにはこのメソッドがありません(または見つかりませんでした)。

編集:

として直接実装されているため、ありDbQueryません。ToTraceStringToString

于 2011-03-01T12:34:50.793 に答える
10

これは私のために働きました、そしてそれは無料です:

public static class DebugExtensions
{
    private static object GetPropertyValue(object o, string Name)
    {
        return o.GetType().GetProperties(BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public).Where(x => x.Name == Name).First().GetValue(o, null);
    }
    public static string ToTraceString(this IQueryable query)
    {
        var oquery = (ObjectQuery)GetPropertyValue(GetPropertyValue(query, "InternalQuery"), "ObjectQuery");
        return oquery.ToTraceString();
    }
}

使用法:

   var rows = db.Forecasts.Take(1);
   System.Diagnostics.Debug.WriteLine(rows.ToTraceString());
于 2012-09-30T09:15:14.070 に答える
3

SQLトレースを使用してサーバーで実行されているクエリを直接取得するか、 ANTS Performance ProfilerのイベントトレースforWindows(SQLプロファイリング)機能を使用します。

于 2011-03-01T11:30:30.913 に答える
2

ロギングの設定は次のように簡単です。

context.Database.Log = Console.WriteLine;

元の回答:https ://stackoverflow.com/a/20757916/2183503

于 2016-06-27T23:50:17.670 に答える
1

拡張メソッドToTraceString()はあなたが探しているものかもしれません:

http://msdn.microsoft.com/en-us/library/system.data.objects.objectquery.totracestring.aspx

于 2011-03-01T12:11:20.550 に答える