質問: ORMとしてDapper Extensions(DE)を使用しています。リポジトリパターンを使用して実装されているデータアクセス層で消費されます。 SQL ExpressはバックエンドRDBMSです。 DEは私のためにほとんどのクエリを自動的に生成します。これらの自動生成されたクエリをデバッグ目的で記録したいです。 **これを達成するために私が見ることができる2つの方法があります: -** 1. DEによって生成されたSQLクエリ(実行前または実行後)を取得し、それをログに書き込みます。 **私**はすでにlog4netを使ったロギングモジュールを持っているので、 **これは私にとって好ましい方法です** 。私が必要とする唯一のものはDEによって生成されたSQLです。 2. DEを何らかのロギングツールと統合します。私はこの答えを読みました。 MiniProfilerツールを使用すると可能に見えます。しかし、私が上で言ったように、私はすでに私のロギングモジュールを持っています。 SQLクエリを記録するためだけに他のツールを使用したくはありません。 他のロギングツールを使用せずにDapper Extensionsによって自動生成されたSQLクエリを記録/取得するにはどうすればよいですか? 他の同様の質問はDapperについてです。この質問はDapper Extensionsについてです。
回答: @MarcGravellからのコメントとDapperで同じことをするこの質問を見ると、 `MiniProfiler.Integrations`はDapper Extensionsのロギングを実装するより良い方法です。 上のリンクされた質問はDapperについてです。しかし、Dapper ExtensionsはDapperを内部的に使用します。したがって、Dapperのログ機能が実装されている場合、Dapper拡張機能も同様に動作します。 詳細はGitHubにあります 。 サンプルコードは以下の通りです: ``` var factory = new SqlServerDbConnectionFactory(connectionString); CustomDbProfiler cp = new CustomDbProfiler(); using(var connection = DbConnectionFactoryHelper.New(factory, cp)) { //DB Code } string log = cp.ProfilerContext.GetCommands(); ``` あなたには、ビルドに使用することができます`CustomDbProfiler`使用`CustomDbProfiler.Current`それはあなたの必要性に合っている場合。 `cp.ProfilerContext.GetCommands()`は、何回呼び出しても、すべてのコマンド(成功したか失敗したか`cp.ProfilerContext.GetCommands()`を返します。私は確信していませんが、それは内部的に連結された文字列( `StringBuilder`かもしれない)を維持するかもしれません。この場合、パフォーマンスが低下する可能性があります。しかし、私の場合は、デフォルトでロギングは無効になっています。私は何かをデバッグする必要があるときだけログを有効にします。これは私にとっては問題ではありません。 これはまた、単一の接続が非常に広い範囲にわたって使用される場合、メモリフットプリントの問題を引き起こす可能性があります。これを回避するには、 `CustomDbProfiler`インスタンスが正しく配置されていることを確認して`CustomDbProfiler` 。 問題に言及したように、当初、 **私はこの方法(外部ツール/ライブラリを使用)を避けたかったのです** 。しかし、 `MiniProfiler.Integrations`はログ自体を書きません。私は単純に生成されたすべてのクエリを取得し、それらをファイルにダンプするために私のロガーモジュールに提供することができます。それが今、私にはもっと適しているのです。 MiniProfiler.dllは、 こことここで言及されている同様のロジック( `StackExchange.Profiling.Data.ProfiledDbConnection`と`StackExchange.Profiling.Data.ProfiledDbCommand`クラス)を内部的に実装しています 。ですから、もし私がMiniProfilerをバイパスすることを決めたら、私はこの実装を自分で使うことができます。