
ご挨拶!
プログラミング
に関する一連の記事を続けます。 今回は、Entity Framework(以下EFと呼びます)のために第4版から第6版まで書いた無料のプロファイラーと、.NETコードをその場で逆コンパイルするなど、私が適用したいくつかのソリューションについてお話したいと思います例外処理など。
EF6のNugetパッケージ:
https ://www.nuget.org/packages/EFlogger-For6/
EF4-5のNugetパッケージ:
https ://www.nuget.org/packages/EFlogger-For4/
カットの下の詳細。
はじめに
EFの学習を開始したとき、EFが生成するクエリのプロファイリングについて質問がありました。 いくつかの検索の後、EFが通常のツールを提供していないことに気がつき、
私は 、非常に不便なSQL Server Profilerプログラムを使用するか、かなり高価なサードパーティツール
Entity Framework Profiler 2.0を389.00ドルで使用しなければ
なりませんでした。
EFバージョン6の登場により、コマンドロギングの状況が変わりました。 独自のインターセプターを追加できるメカニズムが登場しました。
public class LogFormatter : IDbCommandInterceptor { private readonly Stopwatch _stopwatch = new Stopwatch(); public void NonQueryExecuting(DbCommand command, DbCommandInterceptionContext<int> interceptionContext) {
public static class Logger { public static void Log(DbCommand command, long elapsedMilliseconds, Exception exception) {
EFの4番目のバージョンでは、同様のログメカニズムは見つかりませんでした。
私の決断
プロファイラーを作成し、有料のプロファイラーの機能を繰り返すというアイディアは、かなり前から持ち歩いています。 初期バージョンはEFバージョン6インターセプターメカニズムに基づいていましたが、残念ながらEFバージョン4ではこのメカニズムは機能しません。
短いグーグル検索の後、ASP MVCアプリケーションでEFをプロファイリングするための、
MiniProfilerと呼ばれるすばらしいライブラリが見つかりました。 それに基づいて、アプリケーションを作成することが決定されました。
どうした
システムは、使用および統合が可能な限りシンプルであることが判明しました。 wordpress-e
http://ef-logger.com/で作成したサイトのサンプルプロジェクトでバイナリを取得できます
。EF6のNugetパッケージ:
https ://www.nuget.org/packages/EFlogger-For6/
メインアプリケーションウィンドウ:

使用する
1.
バイナリとサンプルプロジェクトを含むアーカイブを
取得する
2. EF 4-5バージョンの場合はライブラリEFlogger.EntityFramework4.dllを、EF 6thバージョンの場合はEFlogger.EntityFramework6.dllを接続します
3.静的メソッドを実行してプロファイラーを初期化します
4. EFlogger.exeアプリケーションを起動します
API
EFlogger.EntityFramework6.dlライブラリの例。EFlogger.EntityFramework4.dlを使用する場合、静的クラスはEFloggerFor4と呼ばれます
すべての仕組み
EF 4thバージョンの実装メカニズムは、EF 6thバージョンとは大きく異なります。
EF 4のDbProviderFactoryを置き換えるための通常のメカニズムはないため、リフレクションを使用してファクトリを独自のファクトリに置き換える必要があります。
プロセス自体は次のようになります。
EF 6thバージョンへの統合については、サービスを置き換えるための通常のメカニズムを使用できます。
DbConfiguration.Loaded += (_, a) => a.ReplaceService<DbProviderServices>((s, k) => new EFProfiledDbProviderServices());
逆コンパイル
EFloggerはコードを逆コンパイルし、この要求またはその要求を生成したメソッドの本体を表示します。 このために、
ILSpyリフレクターの無料のアナログのライブラリが
使用されます。 メソッドを逆コンパイルするには、最初にStack Traceを起動して、サードパーティライブラリへの不要な呼び出しを排除することにより、それを見つける必要があります。
public static string Get(out StackFrame outStackFrame) { outStackFrame = null; var frames = new StackTrace(0, true).GetFrames(); if (frames == null) { return ""; } var methods = new List<string>();
private static string GetMethodBody(StackFrame stackFrame) { MethodBase methodBase = stackFrame.GetMethod(); return Decompiler.GetSourceCode(methodBase.Module.FullyQualifiedName, methodBase.DeclaringType.Name, methodBase.Name); }
逆コンパイラ using System; using System.IO; using System.Linq; using ICSharpCode.Decompiler; using ICSharpCode.Decompiler.Ast; using ICSharpCode.Decompiler.Ast.Transforms; using Mono.Cecil; namespace Common { public static class Decompiler { public static string GetSourceCode(string pathToAssembly, string className, string methodName) { try { var assemblyDefinition = AssemblyDefinition.ReadAssembly(pathToAssembly); TypeDefinition assembleDefenition = assemblyDefinition.MainModule.Types.First(type => type.Name == className); MethodDefinition methodDefinition = assembleDefenition.Methods.First(method => method.Name == methodName); var output = new StringWriter(); var plainTextOutput = new PlainTextOutput(output); DecompileMethod(methodDefinition, plainTextOutput); return output.ToString(); } catch (Exception exception) { return string.Format( "Exception in decompling. \r\n Message:{0}, \r\n Inner Exception:{1}, \r\n StackTrace:{2}",exception.Message, exception.InnerException, exception.StackTrace); } } private static void DecompileMethod(MethodDefinition method, ITextOutput output) { AstBuilder codeDomBuilder = CreateAstBuilder(currentType: method.DeclaringType, isSingleMember: true); if (method.IsConstructor && !method.IsStatic && !method.DeclaringType.IsValueType) { AddFieldsAndCtors(codeDomBuilder, method.DeclaringType, method.IsStatic); RunTransformsAndGenerateCode(codeDomBuilder, output); } else { codeDomBuilder.AddMethod(method); RunTransformsAndGenerateCode(codeDomBuilder, output); } } private static AstBuilder CreateAstBuilder(ModuleDefinition currentModule = null, TypeDefinition currentType = null, bool isSingleMember = false) { if (currentModule == null) currentModule = currentType.Module; var settings = new DecompilerSettings(); if (isSingleMember) { settings = settings.Clone(); settings.UsingDeclarations = false; } return new AstBuilder( new DecompilerContext(currentModule) { CurrentType = currentType, Settings = settings }); } private static void AddFieldsAndCtors(AstBuilder codeDomBuilder, TypeDefinition declaringType, bool isStatic) { foreach (var field in declaringType.Fields) { if (field.IsStatic == isStatic) codeDomBuilder.AddField(field); } foreach (var ctor in declaringType.Methods) { if (ctor.IsConstructor && ctor.IsStatic == isStatic) codeDomBuilder.AddMethod(ctor); } } private static void RunTransformsAndGenerateCode(AstBuilder astBuilder, ITextOutput output, IAstTransform additionalTransform = null) { astBuilder.GenerateCode(output); } } }
Yandexファイルで動作する逆コンパイルプロジェクトの例:
yadi.sk/d/AzBGet5-Nwns2例外処理ウィンドウ
アプリケーションが定期的にクラッシュすることは秘密ではありません。これはさまざまな理由で発生する可能性があります。開発者のタスクは、エラーメッセージに対して何らかの健全なウィンドウを表示することです。
私のフォームバリアントは次のようになります。

このフォームは、エラー、再現手順、および応答する電子メールに関する情報を追加するようユーザーに求めます。
[送信]ボタンをクリックすると、すべてのデータが記載されたレターが開発者にメールで送信されます。
[STAThread] [STAThread] static void Main() { SetupLogger();
エラー処理フォームを含む作業ドラフトの例は、Yandexファイルにあります:
yadi.sk/d/7y4i_cz7NwtE3ネットワーク接続
プラグインライブラリとプロファイラーの間のネットワーク相互作用の詳細については、以前の記事「
CでのTCPによるネットワーク通信#ちょっとしたユーモア
友人の
実験ツールでツールをテストしているときに、このような信じられないほど生成されたリクエストが見つかりました(非常に大きくて奇妙です):
リクエストコマンドテキスト:
選択
[Project238]。[C4] AS [C1]、
[Project238]。[Name] AS [Name]、
[Project238]。[Name1] AS [Name1]、
[Project238]。[C2] AS [C2]、
[Project238]。[C3] AS [C3]、
[Project238]。[C1] AS [C4]
FROM(選択
[GroupBy1]。[A1] AS [C1]、
[GroupBy1]。[K1] AS [名前]、
[GroupBy1]。[K2] AS [Name1]、
[GroupBy1]。[K3] AS [C2]、
[GroupBy1]。[K4] AS [C3]、
1 AS [C4]
FROM(選択
[Project237]。[Name] AS [K1]、
[Project237]。[Name1] AS [K2]、
[Project237]。[C1] AS [K3]、
[Project237]。[C2] AS [K4]、
COUNT(1)AS [A1]
FROM(選択
[Extent2]。[Name] AS [Name]、
[Extent3]。[Name] AS [Name1]、
DATEPART(年、[Join3]。[C11])AS [C1]、
DATEPART(月、[Join3]。[C12])AS [C2]
FROM [OccupationHistory] AS [Extent1]
INNER JOIN [Division] AS [Extent2] ON [Extent1]。[DivisionID] = [Extent2]。[Id]
INNER JOIN [Position] AS [Extent3] ON [Extent1]。[PositionID] = [Extent3]。[Id]
CROSS JOIN(SELECT [UnionAll59]。[C1] AS [C11]、[UnionAll118]。[C1] AS [C12]
FROM(選択
[UnionAll58]。[C1] AS [C1]
FROM(選択
[UnionAll57]。[C1] AS [C1]
FROM(選択
[UnionAll56]。[C1] AS [C1]
FROM(選択
[UnionAll55]。[C1] AS [C1]
FROM(選択
[UnionAll54]。[C1] AS [C1]
FROM(選択
[UnionAll53]。[C1] AS [C1]
FROM(選択
[UnionAll52]。[C1] AS [C1]
FROM(選択
[UnionAll51]。[C1] AS [C1]
FROM(選択
[UnionAll50]。[C1] AS [C1]
FROM(選択
[UnionAll49]。[C1] AS [C1]
FROM(選択
[UnionAll48]。[C1] AS [C1]
FROM(選択
[UnionAll47]。[C1] AS [C1]
FROM(選択
[UnionAll46]。[C1] AS [C1]
FROM(選択
[UnionAll45]。[C1] AS [C1]
FROM(選択
[UnionAll44]。[C1] AS [C1]
FROM(選択
[UnionAll43]。[C1] AS [C1]
FROM(選択
[UnionAll42]。[C1] AS [C1]
FROM(選択
[UnionAll41]。[C1] AS [C1]
FROM(選択
[UnionAll40]。[C1] AS [C1]
FROM(選択
[UnionAll39]。[C1] AS [C1]
FROM(選択
[UnionAll38]。[C1] AS [C1]
FROM(選択
[UnionAll37]。[C1] AS [C1]
FROM(選択
[UnionAll36]。[C1] AS [C1]
FROM(選択
[UnionAll35]。[C1] AS [C1]
FROM(選択
[UnionAll34]。[C1] AS [C1]
FROM(選択
[UnionAll33]。[C1] AS [C1]
FROM(選択
[UnionAll32]。[C1] AS [C1]
FROM(選択
[UnionAll31]。[C1] AS [C1]
FROM(選択
[UnionAll30]。[C1] AS [C1]
FROM(選択
[UnionAll29]。[C1] AS [C1]
FROM(選択
[UnionAll28]。[C1] AS [C1]
FROM(選択
[UnionAll27]。[C1] AS [C1]
FROM(選択
[UnionAll26]。[C1] AS [C1]
FROM(選択
[UnionAll25]。[C1] AS [C1]
FROM(選択
[UnionAll24]。[C1] AS [C1]
FROM(選択
[UnionAll23]。[C1] AS [C1]
FROM(選択
[UnionAll22]。[C1] AS [C1]
FROM(選択
[UnionAll21]。[C1] AS [C1]
FROM(選択
[UnionAll20]。[C1] AS [C1]
FROM(選択
[UnionAll19]。[C1] AS [C1]
FROM(選択
[UnionAll18]。[C1] AS [C1]
FROM(選択
[UnionAll17]。[C1] AS [C1]
FROM(選択
[UnionAll16]。[C1] AS [C1]
FROM(選択
[UnionAll15]。[C1] AS [C1]
FROM(選択
[UnionAll14]。[C1] AS [C1]
FROM(選択
[UnionAll13]。[C1] AS [C1]
FROM(選択
[UnionAll12]。[C1] AS [C1]
FROM(選択
[UnionAll11]。[C1] AS [C1]
FROM(選択
[UnionAll10]。[C1] AS [C1]
FROM(選択
[UnionAll9]。[C1] AS [C1]
FROM(選択
[UnionAll8]。[C1] AS [C1]
FROM(選択
[UnionAll7]。[C1] AS [C1]
FROM(選択
[UnionAll6]。[C1] AS [C1]
FROM(選択
[UnionAll5]。[C1] AS [C1]
FROM(選択
[UnionAll4]。[C1] AS [C1]
FROM(選択
[UnionAll3]。[C1] AS [C1]
FROM(選択
[UnionAll2]。[C1] AS [C1]
FROM(選択
[UnionAll1]。[C1] AS [C1]
FROM(選択
変換(datetime、 '2001-01-01 00:00:00.000'、121)AS [C1]
FROM(SELECT 1 AS X)AS [SingleRowTable1]
UNION ALL
選択
変換(datetime、 '2001-02-01 00:00:00.000'、121)AS [C1]
FROM(SELECT 1 AS X)AS [SingleRowTable2])AS [UnionAll1]
UNION ALL
選択
変換(datetime、 '2001-03-01 00:00:00.000'、121)AS [C1]
FROM(SELECT 1 AS X)AS [SingleRowTable3])AS [UnionAll2]
UNION ALL
選択
変換(datetime、 '2001-04-01 00:00:00.000'、121)AS [C1]
FROM(SELECT 1 AS X)AS [SingleRowTable4])AS [UnionAll3]
UNION ALL
選択
変換(datetime、 '2001-05-01 00:00:00.000'、121)AS [C1]
FROM(SELECT 1 AS X)AS [SingleRowTable5])AS [UnionAll4]
UNION ALL
選択
変換(datetime、 '2001-06-01 00:00:00.000'、121)AS [C1]
FROM(SELECT 1 AS X)AS [SingleRowTable6])AS [UnionAll5]
UNION ALL
選択
変換(datetime、 '2001-07-01 00:00:00.000'、121)AS [C1]
FROM(SELECT 1 AS X)AS [SingleRowTable7])AS [UnionAll6]
UNION ALL
選択
変換(datetime、 '2001-08-01 00:00:00.000'、121)AS [C1]
FROM(SELECT 1 AS X)AS [SingleRowTable8])AS [UnionAll7]
UNION ALL
選択
convert(datetime、 '2001-09-01 00:00:00.000'、121)AS [C1]
FROM(SELECT 1 AS X)AS [SingleRowTable9])AS [UnionAll8]
UNION ALL
選択
変換(datetime、 '2001-10-01 00:00:00.000'、121)AS [C1]
FROM(SELECT 1 AS X)AS [SingleRowTable10])AS [UnionAll9]
UNION ALL
選択
変換(datetime、 '2001-11-01 00:00:00.000'、121)AS [C1]
FROM(SELECT 1 AS X)AS [SingleRowTable11])AS [UnionAll10]
UNION ALL
選択
変換(datetime、 '2001-12-01 00:00:00.000'、121)AS [C1]
FROM(SELECT 1 AS X)AS [SingleRowTable12])AS [UnionAll11]
UNION ALL
選択
変換(datetime、 '2002-01-01 00:00:00.000'、121)AS [C1]
FROM(SELECT 1 AS X)AS [SingleRowTable13])AS [UnionAll12]
UNION ALL
選択
変換(datetime、 '2002-02-01 00:00:00.000'、121)AS [C1]
FROM(SELECT 1 AS X)AS [SingleRowTable14])AS [UnionAll13]
UNION ALL
選択
変換(datetime、 '2002-03-01 00:00:00.000'、121)AS [C1]
FROM(SELECT 1 AS X)AS [SingleRowTable15])AS [UnionAll14]
UNION ALL
選択
convert(datetime、 '2002-04-01 00:00:00.000'、121)AS [C1]
FROM(SELECT 1 AS X)AS [SingleRowTable16])AS [UnionAll15]
UNION ALL
選択
変換(datetime、 '2002-05-01 00:00:00.000'、121)AS [C1]
FROM(SELECT 1 AS X)AS [SingleRowTable17])AS [UnionAll16]
UNION ALL
選択
変換(datetime、 '2002-06-01 00:00:00.000'、121)AS [C1]
FROM(SELECT 1 AS X)AS [SingleRowTable18])AS [UnionAll17]
UNION ALL
選択
変換(datetime、 '2002-07-01 00:00:00.000'、121)AS [C1]
FROM(SELECT 1 AS X)AS [SingleRowTable19])AS [UnionAll18]
UNION ALL
選択
変換(datetime、 '2002-08-01 00:00:00.000'、121)AS [C1]
FROM(SELECT 1 AS X)AS [SingleRowTable20])AS [UnionAll19]
UNION ALL
選択
変換(datetime、 '2002-09-01 00:00:00.000'、121)AS [C1]
FROM(SELECT 1 AS X)AS [SingleRowTable21])AS [UnionAll20]
UNION ALL
選択
変換(datetime、 '2002-10-01 00:00:00.000'、121)AS [C1]
FROM(SELECT 1 AS X)AS [SingleRowTable22])AS [UnionAll21]
UNION ALL
選択
変換(datetime、 '2002-11-01 00:00:00.000'、121)AS [C1]
FROM(SELECT 1 AS X)AS [SingleRowTable23])AS [UnionAll22]
UNION ALL
選択
変換(datetime、 '2002-12-01 00:00:00.000'、121)AS [C1]
FROM(SELECT 1 AS X)AS [SingleRowTable24])AS [UnionAll23]
UNION ALL
選択
convert(datetime、 '2003-01-01 00:00:00.000'、121)AS [C1]
FROM(SELECT 1 AS X)AS [SingleRowTable25])AS [UnionAll24]
UNION ALL
選択
convert(datetime、 '2003-02-01 00:00:00.000'、121)AS [C1]
FROM(SELECT 1 AS X)AS [SingleRowTable26])AS [UnionAll25]
UNION ALL
選択
変換(datetime、「2003-03-01 00:00:00.000」、121)AS [C1]
FROM(SELECT 1 AS X)AS [SingleRowTable27])AS [UnionAll26]
UNION ALL
選択
変換(datetime、 '2003-04-01 00:00:00.000'、121)AS [C1]
FROM(SELECT 1 AS X)AS [SingleRowTable28])AS [UnionAll27]
UNION ALL
選択
convert(datetime、 '2003-05-01 00:00:00.000'、121)AS [C1]
FROM(SELECT 1 AS X)AS [SingleRowTable29])AS [UnionAll28]
UNION ALL
選択
convert(datetime、 '2003-06-01 00:00:00.000'、121)AS [C1]
FROM(SELECT 1 AS X)AS [SingleRowTable30])AS [UnionAll29]
UNION ALL
選択
convert(datetime、 '2003-07-01 00:00:00.000'、121)AS [C1]
FROM(SELECT 1 AS X)AS [SingleRowTable31])AS [UnionAll30]
UNION ALL
選択
convert(datetime、 '2003-08-01 00:00:00.000'、121)AS [C1]
FROM(SELECT 1 AS X)AS [SingleRowTable32])AS [UnionAll31]
UNION ALL
選択
変換(datetime、 '2003-09-01 00:00:00.000'、121)AS [C1]
FROM(SELECT 1 AS X)AS [SingleRowTable33])AS [UnionAll32]
UNION ALL
選択
convert(datetime、 '2003-10-01 00:00:00.000'、121)AS [C1]
FROM(SELECT 1 AS X)AS [SingleRowTable34])AS [UnionAll33]
UNION ALL
選択
変換(datetime、「2003-11-01 00:00:00.000」、121)AS [C1]
FROM(SELECT 1 AS X)AS [SingleRowTable35])AS [UnionAll34]
UNION ALL
選択
変換(datetime、 '2003-12-01 00:00:00.000'、121)AS [C1]
FROM(SELECT 1 AS X)AS [SingleRowTable36])AS [UnionAll35]
UNION ALL
選択
convert(datetime、 '2004-01-01 00:00:00.000'、121)AS [C1]
FROM(SELECT 1 AS X)AS [SingleRowTable37])AS [UnionAll36]
UNION ALL
選択
convert(datetime、 '2004-02-01 00:00:00.000'、121)AS [C1]
FROM(SELECT 1 AS X)AS [SingleRowTable38])AS [UnionAll37]
UNION ALL
選択
変換(datetime、「2004-03-01 00:00:00.000」、121)AS [C1]
FROM(SELECT 1 AS X)AS [SingleRowTable39])AS [UnionAll38]
UNION ALL
選択
変換(datetime、 '2004-04-01 00:00:00.000'、121)AS [C1]
FROM(SELECT 1 AS X)AS [SingleRowTable40])AS [UnionAll39]
UNION ALL
選択
convert(datetime、 '2004-05-01 00:00:00.000'、121)AS [C1]
FROM(SELECT 1 AS X)AS [SingleRowTable41])AS [UnionAll40]
UNION ALL
選択
変換(datetime、「2004-06-01 00:00:00.000」、121)AS [C1]
FROM(SELECT 1 AS X)AS [SingleRowTable42])AS [UnionAll41]
UNION ALL
選択
convert(datetime、 '2004-07-01 00:00:00.000'、121)AS [C1]
FROM(SELECT 1 AS X)AS [SingleRowTable43])AS [UnionAll42]
UNION ALL
選択
変換(datetime、「2004-08-01 00:00:00.000」、121)AS [C1]
FROM(SELECT 1 AS X)AS [SingleRowTable44])AS [UnionAll43]
UNION ALL
選択
変換(datetime、 '2004-09-01 00:00:00.000'、121)AS [C1]
FROM(SELECT 1 AS X)AS [SingleRowTable45])AS [UnionAll44]
UNION ALL
選択
convert(datetime、 '2004-10-01 00:00:00.000'、121)AS [C1]
FROM(SELECT 1 AS X)AS [SingleRowTable46])AS [UnionAll45]
UNION ALL
選択
変換(datetime、「2004-11-01 00:00:00.000」、121)AS [C1]
FROM(SELECT 1 AS X)AS [SingleRowTable47])AS [UnionAll46]
UNION ALL
選択
変換(datetime、「2004-12-01 00:00:00.000」、121)AS [C1]
FROM(SELECT 1 AS X)AS [SingleRowTable48])AS [UnionAll47]
UNION ALL
選択
convert(datetime、 '2005-01-01 00:00:00.000'、121)AS [C1]
FROM(SELECT 1 AS X)AS [SingleRowTable49])AS [UnionAll48]
UNION ALL
選択
変換(datetime、「2005-02-01 00:00:00.000」、121)AS [C1]
FROM(SELECT 1 AS X)AS [SingleRowTable50])AS [UnionAll49]
UNION ALL
選択
convert(datetime、 '2005-03-01 00:00:00.000'、121)AS [C1]
FROM(SELECT 1 AS X)AS [SingleRowTable51])AS [UnionAll50]
UNION ALL
選択
convert(datetime、 '2005-04-01 00:00:00.000'、121)AS [C1]
FROM(SELECT 1 AS X)AS [SingleRowTable52])AS [UnionAll51]
UNION ALL
選択
convert(datetime、 '2005-05-01 00:00:00.000'、121)AS [C1]
FROM(SELECT 1 AS X)AS [SingleRowTable53])AS [UnionAll52]
UNION ALL
選択
変換(datetime、「2005-06-01 00:00:00.000」、121)AS [C1]
FROM(SELECT 1 AS X)AS [SingleRowTable54])AS [UnionAll53]
UNION ALL
選択
convert(datetime、 '2005-07-01 00:00:00.000'、121)AS [C1]
FROM(SELECT 1 AS X)AS [SingleRowTable55])AS [UnionAll54]
UNION ALL
選択
変換(datetime、「2005-08-01 00:00:00.000」、121)AS [C1]
FROM(SELECT 1 AS X)AS [SingleRowTable56])AS [UnionAll55]
UNION ALL
選択
convert(datetime、 '2005-09-01 00:00:00.000'、121)AS [C1]
FROM(SELECT 1 AS X)AS [SingleRowTable57])AS [UnionAll56]
UNION ALL
選択
変換(datetime、「2005-10-01 00:00:00.000」、121)AS [C1]
FROM(SELECT 1 AS X)AS [SingleRowTable58])AS [UnionAll57]
UNION ALL
選択
convert(datetime、 '2005-11-01 00:00:00.000'、121)AS [C1]
FROM(SELECT 1 AS X)AS [SingleRowTable59])AS [UnionAll58]
UNION ALL
選択
convert(datetime、 '2005-12-01 00:00:00.000'、121)AS [C1]
FROM(SELECT 1 AS X)AS [SingleRowTable60])AS [UnionAll59]
内部結合(選択
[UnionAll117]。[C1] AS [C1]
FROM(選択
[UnionAll116]。[C1] AS [C1]
FROM(選択
[UnionAll115]。[C1] AS [C1]
FROM(選択
[UnionAll114]。[C1] AS [C1]
FROM(選択
[UnionAll113]。[C1] AS [C1]
FROM(選択
[UnionAll112]。[C1] AS [C1]
FROM(選択
[UnionAll111]。[C1] AS [C1]
FROM(選択
[UnionAll110]。[C1] AS [C1]
FROM(選択
[UnionAll109]。[C1] AS [C1]
FROM(選択
[UnionAll108]。[C1] AS [C1]
FROM(選択
[UnionAll107]。[C1] AS [C1]
FROM(選択
[UnionAll106]。[C1] AS [C1]
FROM(選択
[UnionAll105]。[C1] AS [C1]
FROM(選択
[UnionAll104]。[C1] AS [C1]
FROM(選択
[UnionAll103]。[C1] AS [C1]
FROM(選択
[UnionAll102]。[C1] AS [C1]
FROM(選択
[UnionAll101]。[C1] AS [C1]
FROM(選択
[UnionAll100]。[C1] AS [C1]
FROM(選択
[UnionAll99]。[C1] AS [C1]
FROM(選択
[UnionAll98]。[C1] AS [C1]
FROM(選択
[UnionAll97]。[C1] AS [C1]
FROM(選択
[UnionAll96]。[C1] AS [C1]
FROM(選択
[UnionAll95]。[C1] AS [C1]
FROM(選択
[UnionAll94]。[C1] AS [C1]
FROM(選択
[UnionAll93]。[C1] AS [C1]
FROM(選択
[UnionAll92]。[C1] AS [C1]
FROM(選択
[UnionAll91]。[C1] AS [C1]
FROM(選択
[UnionAll90]。[C1] AS [C1]
FROM(選択
[UnionAll89]。[C1] AS [C1]
FROM(選択
[UnionAll88]。[C1] AS [C1]
FROM(選択
[UnionAll87]。[C1] AS [C1]
FROM(選択
[UnionAll86]。[C1] AS [C1]
FROM(選択
[UnionAll85]。[C1] AS [C1]
FROM(選択
[UnionAll84]。[C1] AS [C1]
FROM(選択
[UnionAll83]。[C1] AS [C1]
FROM(選択
[UnionAll82]。[C1] AS [C1]
FROM(選択
[UnionAll81]。[C1] AS [C1]
FROM(選択
[UnionAll80]。[C1] AS [C1]
FROM(選択
[UnionAll79]。[C1] AS [C1]
FROM(選択
[UnionAll78]。[C1] AS [C1]
FROM(選択
[UnionAll77]。[C1] AS [C1]
FROM(選択
[UnionAll76]。[C1] AS [C1]
FROM(選択
[UnionAll75]。[C1] AS [C1]
FROM(選択
[UnionAll74]。[C1] AS [C1]
FROM(選択
[UnionAll73]。[C1] AS [C1]
FROM(選択
[UnionAll72]。[C1] AS [C1]
FROM(選択
[UnionAll71]。[C1] AS [C1]
FROM(選択
[UnionAll70]。[C1] AS [C1]
FROM(選択
[UnionAll69]。[C1] AS [C1]
FROM(選択
[UnionAll68]。[C1] AS [C1]
FROM(選択
[UnionAll67]。[C1] AS [C1]
FROM(選択
[UnionAll66]。[C1] AS [C1]
FROM(選択
[UnionAll65]。[C1] AS [C1]
FROM(選択
[UnionAll64]。[C1] AS [C1]
FROM(選択
[UnionAll63]。[C1] AS [C1]
FROM(選択
[UnionAll62]。[C1] AS [C1]
FROM(選択
[UnionAll61]。[C1] AS [C1]
FROM(選択
[UnionAll60]。[C1] AS [C1]
FROM(選択
変換(datetime、 '2001-01-31 00:00:00.000'、121)AS [C1]
FROM(SELECT 1 AS X)AS [SingleRowTable61]
UNION ALL
選択
変換(datetime、 '2001-02-28 00:00:00.000'、121)AS [C1]
FROM(SELECT 1 AS X)AS [SingleRowTable62])AS [UnionAll60]
UNION ALL
選択
変換(datetime、 '2001-03-31 00:00:00.000'、121)AS [C1]
FROM(SELECT 1 AS X)AS [SingleRowTable63])AS [UnionAll61]
UNION ALL
選択
変換(datetime、 '2001-04-30 00:00:00.000'、121)AS [C1]
FROM(SELECT 1 AS X)AS [SingleRowTable64])AS [UnionAll62]
UNION ALL
選択
変換(datetime、 '2001-05-31 00:00:00.000'、121)AS [C1]
FROM(SELECT 1 AS X)AS [SingleRowTable65])AS [UnionAll63]
UNION ALL
選択
変換(datetime、 '2001-06-30 00:00:00.000'、121)AS [C1]
FROM(SELECT 1 AS X)AS [SingleRowTable66])AS [UnionAll64]
UNION ALL
選択
変換(datetime、 '2001-07-31 00:00:00.000'、121)AS [C1]
FROM(SELECT 1 AS X)AS [SingleRowTable67])AS [UnionAll65]
UNION ALL
選択
変換(datetime、 '2001-08-31 00:00:00.000'、121)AS [C1]
FROM(SELECT 1 AS X)AS [SingleRowTable68])AS [UnionAll66]
UNION ALL
選択
変換(datetime、 '2001-09-30 00:00:00.000'、121)AS [C1]
FROM(SELECT 1 AS X)AS [SingleRowTable69])AS [UnionAll67]
UNION ALL
選択
変換(datetime、 '2001-10-31 00:00:00.000'、121)AS [C1]
FROM(SELECT 1 AS X)AS [SingleRowTable70])AS [UnionAll68]
UNION ALL
選択
変換(datetime、 '2001-11-30 00:00:00.000'、121)AS [C1]
FROM(SELECT 1 AS X)AS [SingleRowTable71])AS [UnionAll69]
UNION ALL
選択
変換(datetime、 '2001-12-31 00:00:00.000'、121)AS [C1]
FROM(SELECT 1 AS X)AS [SingleRowTable72])AS [UnionAll70]
UNION ALL
選択
変換(datetime、 '2002-01-31 00:00:00.000'、121)AS [C1]
FROM(SELECT 1 AS X)AS [SingleRowTable73])AS [UnionAll71]
UNION ALL
選択
変換(datetime、 '2002-02-28 00:00:00.000'、121)AS [C1]
FROM(SELECT 1 AS X)AS [SingleRowTable74])AS [UnionAll72]
UNION ALL
選択
変換(datetime、 '2002-03-31 00:00:00.000'、121)AS [C1]
FROM(SELECT 1 AS X)AS [SingleRowTable75])AS [UnionAll73]
UNION ALL
選択
変換(datetime、 '2002-04-30 00:00:00.000'、121)AS [C1]
FROM(SELECT 1 AS X)AS [SingleRowTable76])AS [UnionAll74]
UNION ALL
選択
変換(datetime、 '2002-05-31 00:00:00.000'、121)AS [C1]
FROM(SELECT 1 AS X)AS [SingleRowTable77])AS [UnionAll75]
UNION ALL
選択
変換(datetime、 '2002-06-30 00:00:00.000'、121)AS [C1]
FROM(SELECT 1 AS X)AS [SingleRowTable78])AS [UnionAll76]
UNION ALL
選択
変換(datetime、 '2002-07-31 00:00:00.000'、121)AS [C1]
FROM(SELECT 1 AS X)AS [SingleRowTable79])AS [UnionAll77]
UNION ALL
選択
変換(datetime、 '2002-08-31 00:00:00.000'、121)AS [C1]
FROM(SELECT 1 AS X)AS [SingleRowTable80])AS [UnionAll78]
UNION ALL
選択
変換(datetime、 '2002-09-30 00:00:00.000'、121)AS [C1]
FROM(SELECT 1 AS X)AS [SingleRowTable81])AS [UnionAll79]
UNION ALL
選択
変換(datetime、 '2002-10-31 00:00:00.000'、121)AS [C1]
FROM(SELECT 1 AS X)AS [SingleRowTable82])AS [UnionAll80]
UNION ALL
選択
変換(datetime、 '2002-11-30 00:00:00.000'、121)AS [C1]
FROM(SELECT 1 AS X)AS [SingleRowTable83])AS [UnionAll81]
UNION ALL
選択
変換(datetime、 '2002-12-31 00:00:00.000'、121)AS [C1]
FROM ( SELECT 1 AS X ) AS [SingleRowTable84]) AS [UnionAll82]
UNION ALL
SELECT
convert(datetime, '2003-01-31 00:00:00.000', 121) AS [C1]
FROM ( SELECT 1 AS X ) AS [SingleRowTable85]) AS [UnionAll83]
UNION ALL
SELECT
convert(datetime, '2003-02-28 00:00:00.000', 121) AS [C1]
FROM ( SELECT 1 AS X ) AS [SingleRowTable86]) AS [UnionAll84]
UNION ALL
SELECT
convert(datetime, '2003-03-31 00:00:00.000', 121) AS [C1]
FROM ( SELECT 1 AS X ) AS [SingleRowTable87]) AS [UnionAll85]
UNION ALL
SELECT
convert(datetime, '2003-04-30 00:00:00.000', 121) AS [C1]
FROM ( SELECT 1 AS X ) AS [SingleRowTable88]) AS [UnionAll86]
UNION ALL
SELECT
convert(datetime, '2003-05-31 00:00:00.000', 121) AS [C1]
FROM ( SELECT 1 AS X ) AS [SingleRowTable89]) AS [UnionAll87]
UNION ALL
SELECT
convert(datetime, '2003-06-30 00:00:00.000', 121) AS [C1]
FROM ( SELECT 1 AS X ) AS [SingleRowTable90]) AS [UnionAll88]
UNION ALL
SELECT
convert(datetime, '2003-07-31 00:00:00.000', 121) AS [C1]
FROM ( SELECT 1 AS X ) AS [SingleRowTable91]) AS [UnionAll89]
UNION ALL
SELECT
convert(datetime, '2003-08-31 00:00:00.000', 121) AS [C1]
FROM ( SELECT 1 AS X ) AS [SingleRowTable92]) AS [UnionAll90]
UNION ALL
SELECT
convert(datetime, '2003-09-30 00:00:00.000', 121) AS [C1]
FROM ( SELECT 1 AS X ) AS [SingleRowTable93]) AS [UnionAll91]
UNION ALL
SELECT
convert(datetime, '2003-10-31 00:00:00.000', 121) AS [C1]
FROM ( SELECT 1 AS X ) AS [SingleRowTable94]) AS [UnionAll92]
UNION ALL
SELECT
convert(datetime, '2003-11-30 00:00:00.000', 121) AS [C1]
FROM ( SELECT 1 AS X ) AS [SingleRowTable95]) AS [UnionAll93]
UNION ALL
SELECT
convert(datetime, '2003-12-31 00:00:00.000', 121) AS [C1]
FROM ( SELECT 1 AS X ) AS [SingleRowTable96]) AS [UnionAll94]
UNION ALL
SELECT
convert(datetime, '2004-01-31 00:00:00.000', 121) AS [C1]
FROM ( SELECT 1 AS X ) AS [SingleRowTable97]) AS [UnionAll95]
UNION ALL
SELECT
convert(datetime, '2004-02-29 00:00:00.000', 121) AS [C1]
FROM ( SELECT 1 AS X ) AS [SingleRowTable98]) AS [UnionAll96]
UNION ALL
SELECT
convert(datetime, '2004-03-31 00:00:00.000', 121) AS [C1]
FROM ( SELECT 1 AS X ) AS [SingleRowTable99]) AS [UnionAll97]
UNION ALL
SELECT
convert(datetime, '2004-04-30 00:00:00.000', 121) AS [C1]
FROM ( SELECT 1 AS X ) AS [SingleRowTable100]) AS [UnionAll98]
UNION ALL
SELECT
convert(datetime, '2004-05-31 00:00:00.000', 121) AS [C1]
FROM ( SELECT 1 AS X ) AS [SingleRowTable101]) AS [UnionAll99]
UNION ALL
SELECT
convert(datetime, '2004-06-30 00:00:00.000', 121) AS [C1]
FROM ( SELECT 1 AS X ) AS [SingleRowTable102]) AS [UnionAll100]
UNION ALL
SELECT
convert(datetime, '2004-07-31 00:00:00.000', 121) AS [C1]
FROM ( SELECT 1 AS X ) AS [SingleRowTable103]) AS [UnionAll101]
UNION ALL
SELECT
convert(datetime, '2004-08-31 00:00:00.000', 121) AS [C1]
FROM ( SELECT 1 AS X ) AS [SingleRowTable104]) AS [UnionAll102]
UNION ALL
SELECT
convert(datetime, '2004-09-30 00:00:00.000', 121) AS [C1]
FROM ( SELECT 1 AS X ) AS [SingleRowTable105]) AS [UnionAll103]
UNION ALL
SELECT
convert(datetime, '2004-10-31 00:00:00.000', 121) AS [C1]
FROM ( SELECT 1 AS X ) AS [SingleRowTable106]) AS [UnionAll104]
UNION ALL
SELECT
convert(datetime, '2004-11-30 00:00:00.000', 121) AS [C1]
FROM ( SELECT 1 AS X ) AS [SingleRowTable107]) AS [UnionAll105]
UNION ALL
SELECT
convert(datetime, '2004-12-31 00:00:00.000', 121) AS [C1]
FROM ( SELECT 1 AS X ) AS [SingleRowTable108]) AS [UnionAll106]
UNION ALL
SELECT
convert(datetime, '2005-01-31 00:00:00.000', 121) AS [C1]
FROM ( SELECT 1 AS X ) AS [SingleRowTable109]) AS [UnionAll107]
UNION ALL
SELECT
convert(datetime, '2005-02-28 00:00:00.000', 121) AS [C1]
FROM ( SELECT 1 AS X ) AS [SingleRowTable110]) AS [UnionAll108]
UNION ALL
SELECT
convert(datetime, '2005-03-31 00:00:00.000', 121) AS [C1]
FROM ( SELECT 1 AS X ) AS [SingleRowTable111]) AS [UnionAll109]
UNION ALL
SELECT
convert(datetime, '2005-04-30 00:00:00.000', 121) AS [C1]
FROM ( SELECT 1 AS X ) AS [SingleRowTable112]) AS [UnionAll110]
UNION ALL
SELECT
convert(datetime, '2005-05-31 00:00:00.000', 121) AS [C1]
FROM ( SELECT 1 AS X ) AS [SingleRowTable113]) AS [UnionAll111]
UNION ALL
SELECT
convert(datetime, '2005-06-30 00:00:00.000', 121) AS [C1]
FROM ( SELECT 1 AS X ) AS [SingleRowTable114]) AS [UnionAll112]
UNION ALL
SELECT
convert(datetime, '2005-07-31 00:00:00.000', 121) AS [C1]
FROM ( SELECT 1 AS X ) AS [SingleRowTable115]) AS [UnionAll113]
UNION ALL
SELECT
convert(datetime, '2005-08-31 00:00:00.000', 121) AS [C1]
FROM ( SELECT 1 AS X ) AS [SingleRowTable116]) AS [UnionAll114]
UNION ALL
SELECT
convert(datetime, '2005-09-30 00:00:00.000', 121) AS [C1]
FROM ( SELECT 1 AS X ) AS [SingleRowTable117]) AS [UnionAll115]
UNION ALL
SELECT
convert(datetime, '2005-10-31 00:00:00.000', 121) AS [C1]
FROM ( SELECT 1 AS X ) AS [SingleRowTable118]) AS [UnionAll116]
UNION ALL
SELECT
convert(datetime, '2005-11-30 00:00:00.000', 121) AS [C1]
FROM ( SELECT 1 AS X ) AS [SingleRowTable119]) AS [UnionAll117]
UNION ALL
SELECT
convert(datetime, '2005-12-31 00:00:00.000', 121) AS [C1]
FROM ( SELECT 1 AS X ) AS [SingleRowTable120]) AS [UnionAll118] ON (((DATEPART (year, [UnionAll59].[C1])) = (DATEPART (year, [UnionAll118].[C1]))) OR ((DATEPART (year, [UnionAll59].[C1]) IS NULL) AND (DATEPART (year, [UnionAll118].[C1]) IS NULL))) AND (((DATEPART (month, [UnionAll59].[C1])) = (DATEPART (month, [UnionAll118].[C1]))) OR ((DATEPART (month, [UnionAll59].[C1]) IS NULL) AND (DATEPART (month, [UnionAll118].[C1]) IS NULL))) ) AS [Join3]
WHERE ([Extent1].[StartDate] <= [Join3].[C12]) AND ((CASE WHEN ([Extent1].[EndDate] IS NOT NULL) THEN [Extent1].[EndDate] ELSE GetDate() END) >= [Join3].[C11])
) AS [Project237]
GROUP BY [Project237].[Name], [Project237].[Name1], [Project237].[C1], [Project237].[C2]
) AS [GroupBy1]
) AS [Project238]
ORDER BY [Project238].[C2] ASC, [Project238].[C3] ASC, [Project238].[Name] ASC, [Project238].[Name1] ASC;
Method Name:GetEmployeesCount;
Class Name:CompanyEmployees.Data.ReportBuilder;
Elapsed Miliseconds:336
あとがき
まだ多くのバグがあると確信していますが、できるだけ早くすべてのエラーを修正しようとします。また、尊敬されるコミュニティハブからこのプロファイラーをどうするかアドバイスを求めたいので、一方で無料の製品を作りたいが、同時にいくらかのお金を稼ぎたい。現在、私はプロファイラーを個人的な使用のために完全に無料にし、企業に支払いをすることを考えていますが、再び最低価格で20-30ドルです。まあ、または単に寄付ボタンでそれを自由のままにしておきます。ご清聴ありがとうございました。
このツールが役に立つことを願っています。PS:すべての質問、バグレポートなどについては、developer @ ef-logger.comまたはst.glushak@gmail.comにメールをお送りください。また、著者は、住宅ローンであるため、副業を探しています。 ご理解いただきありがとうございます。Nuget EF6:
https://www.nuget.org/packages/EFlogger-For6/Nuget EF4 — 5:
https://www.nuget.org/packages/EFlogger-For4/Updated: :