Dapper.NETのようなEntity Framework 6の最高のパフォーマンスを引き出す

c# crud dapper entity-framework performance

質問

私はマイクロオームとしてdapper.netを使用しました、スピードとパフォーマンスは素晴らしいです!

Dapperでの単純なCRUD操作はEntity Framework 6より速いです。

スピード比較ダッパー対エンティティフレームワーク

しかし、もしDapperのような Entity Framework 6のスピードとパフォーマンスが欲しいのなら、どうすればいいですか?

Entity Framework 6の高度な機能がすべて必要なわけではないので、

Entity Framework 6の速度とパフォーマンスを向上させるために一部の機能を無効にすることはできますか? どれ ?

どの機能がコストがかかり、それらを無効にする速度を上げますか? (ご指定ください)

受け入れられた回答

Entity Frameworkによって実際に発行されたSQLコマンドをプロファイリングすることから始める必要があります。設定(POCO、自己追跡エンティティ)によっては、最適化の余地があります。 ObjectSet<T>.ToTraceString()メソッドを使用して、SQLコマンドをデバッグできます(デバッグモードとリリースモードで違いはありませんObjectSet<T>.ToTraceString() 。さらに最適化が必要なクエリに遭遇した場合は、いくつかの予測を使用して、達成しようとしていることについてEFに詳細な情報を提供できます。

例:

Product product = db.Products.SingleOrDefault(p => p.Id == 10);
// executes SELECT * FROM Products WHERE Id = 10

ProductDto dto = new ProductDto();
foreach (Category category in product.Categories)
// executes SELECT * FROM Categories WHERE ProductId = 10
{
    dto.Categories.Add(new CategoryDto { Name = category.Name });
}

に置き換えることができます:

var query = from p in db.Products
            where p.Id == 10
            select new
            {
                p.Name,
                Categories = from c in p.Categories select c.Name
            };
ProductDto dto = new ProductDto();
foreach (var categoryName in query.Single().Categories)
// Executes SELECT p.Id, c.Name FROM Products as p, Categories as c WHERE p.Id = 10 AND p.Id = c.ProductId
{
    dto.Categories.Add(new CategoryDto { Name = categoryName });
}

頭の中から入力しただけなので、実行方法は正確ではありませんが、クエリについて知っていることをすべて伝えると、EFは実際には最適な最適化を行います。名前)。しかし、これはeager-loading(db.Products.Include( "Categories"))のようなものではありません。プロジェクションによってロードするデータ量をさらに減らすことができるからです。


人気のある回答

問題の事実は、Entity Frameworkのような製品は、より多くのコードを実行しているため、常に遅くて非効率的になることです。

また、LINQクエリを最適化し、生成されたSQLを調べ、デバッガを使用し、プリコンパイルし、さらに多くの手順を実行するなど、時間を無駄にするなどの方法を提案するのは愚かです。誰も言わないで - 簡単にする!誰もがさらに多くのステップを踏むことによって物事をさらに批判したいと思います(時間を無駄にします)。

常識的なアプローチは、EFやLINQをまったく使用しないことです。プレーンSQLを使用してください。何も問題ありません。プログラマーの間に群れの考え方があり、彼らがそこに新しい製品をひとつひとつ使用したいという衝動を感じているからといって、それが良いことやうまくいくことを意味するわけではありません。ほとんどのプログラマーは、大企業がリリースした新しいコードをすべて組み込んでいれば、より賢いプログラマーになると考えています。まったく真実ではありません。スマートプログラミングは、主に、頭痛、不確実性を減らし、最小の時間でより多くのことを実行する方法に関するものです。覚えておいて - 時間!それが最も重要な要素なので、単に「パターン」と呼ばれる奇妙なものに準拠するように書かれた不良/肥大化したコードで問題を解決するためにそれを無駄にしない方法を見つけるようにしてください。

リラックスして、人生を楽しんで、コーディングをやめて、余分な機能、コード、製品、「パターン」の使用をやめてください。人生は短く、あなたのコードの寿命はさらに短く、そしてそれは確かにロケット科学ではありません。 LINQ、EFなどのレイヤを削除すると、コードは効率的に実行され、拡張され、そして維持するのも簡単になります。抽象化が多すぎると悪い「パターン」になります。

そしてそれがあなたの問題に対する解決策です。



ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ
ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ