質問: hrctx.Employees.AsNoTracking().ToList(); ``` いくつかの記事で述べたように**AsNoTracking**を使用すると、エンティティフレームワークのキャッシュが停止し、キャッシュを停止した後のdapperサンプルのパフォーマンスが向上します(ただし、それほど大きな違いはありません)。
回答: ORM(Object Relational Mapper)は、アプリケーションとデータソースの間にレイヤーを作成し、ADO.NETオブジェクトの代わりに(使用しているC#に関して)リレーショナルオブジェクトを返すツールです。これはすべてのORMが行う基本的なことです。 これを行うために、ORMは通常クエリを実行し、返された`DataReader`をPOCOクラスに**マッピング**します。 Dapperはここまでに制限されています。 これをさらに拡張するために、一部のORM(「フルORM」とも呼ばれる)では、アプリケーションデータベースを独立させるためのクエリの生成、将来の呼び出しのためのデータのキャッシュ、作業単位の管理など、さまざまな処理を実行します。これらはすべて優れたツールであり、ORMに価値をもたらします。しかし、それは費用が伴います。 Entity Frameworkはこのクラスに分類されます。 クエリを生成するために、EFは追加のコードを実行する必要があります。キャッシュはパフォーマンスを向上させますが、キャッシュを管理するには追加のコードを実行する必要があります。作業単位やEFが提供するその他のアドオン機能についても同様です。これだけで追加のコード**を**書く**必要**がなくなり、EFがコストを負担します。 そして**コスト**はパフォーマンスです。 Dapperは非常に基本的な仕事をしているので、速いです。しかし、もっとコードを書く必要があります。 EFはそれ以上のことをするので、(少し)遅くなります。しかし、あなたはより少ないコードを書く必要があります。 **では、なぜあなたのテストは反対の結果を示すのでしょうか。** 実行しているテストは比較できないためです。 完全ORMには、上で説明したように多くの優れた機能があります。そのうちの1つがUnitOfWorkです。追跡はUoWの責任の1つです。オブジェクトが初めて要求されると(SQL照会)、データベースへのラウンドトリップが発生します。その後、このオブジェクトはメモリキャッシュに保存されます。完全ORMは、すでにロードされているこのオブジェクトに対して行われた変更を追跡します。同じオブジェクトが再度要求された場合(ロードされたオブジェクトを含む同じUoWスコープ内の他のSQL照会)、それらはデータベースのラウンドトリップを行いません。代わりに、それらは代わりにメモリキャッシュからオブジェクトを返します。このようにして、かなりの時間が節約されます。 Dapperはこの機能をサポートしていないため、テストの実行速度が遅くなります。 ただし、この利点は、同じオブジェクトが複数回ロードされた場合にのみ適用されます。また、メモリにロードされたオブジェクトの数が多すぎると、代わりにメモリ内のオブジェクトを*チェック*するのに必要な時間が長くなるため、完全なORMが遅くなります。繰り返しますが、この利点はユースケースに依存します。