Entity Frameworkのコア数に最適なパフォーマンスがない

c# entity-framework-core linq sql-server

質問

私は特定のフィルタでレコードの量を取得する必要があります。

理論的には、この命令:

_dbContext.People.Count (w => w.Type == 1);

それはSQLのように生成する必要があります:

Select count (*)
from People
Where Type = 1

ただし、生成されるSQLは次のとおりです。

Select Id, Name, Type, DateCreated, DateLastUpdate, Address
from People
Where Type = 1

生成されたクエリは、多くのレコードを持つデータベースで実行するまでにはるかに時間がかかります。

最初のクエリを生成する必要があります。

私がちょうどこれをすれば:

_dbContext.People.Count ();

Entity Frameworkは次のクエリを生成します。

Select count (*)
from People

..非常に速く走る。

この2番目のクエリを生成する方法は、検索条件をカウントに渡しますか?

人気のある回答

ここでは答えがあまりありません。あなたのORMツールが単純なLINQクエリから期待されるSQLクエリを生成しない場合、クエリを書き直すことでそれを可能にする方法はありません(そして、最初にそれを行うべきではありません)。

EFコアには、 LINQクエリでのクライアント/データベース混合評価というコンセプトがあり、不完全/非常に非効率なクエリ処理を伴うEFコアバージョンをリリースすることができます。

EFコアにない機能からの抜粋( notという単語に注意してください)とRoadmap

より多くのクエリが正常に実行されるように変換が改善され、より多くのロジックが(メモリではなく)データベースで評価されるようになりました。

まもなく、彼らは照会処理を改善するつもりですが、いつ発生し、どの程度の程度(混合モードで照会を「作業中」と考えることができることを忘れないか)はわかりません。

だからオプションは何ですか?

  • まず、EFコアが本当に便利になるまで、離れてください。 EF6に戻ると、それにはそのような問題はありません。
  • EF6を使用できない場合は、最新のEF Coreバージョンで最新の状態を維持してください。

たとえば、v1.0.1とv1.1.0の両方でクエリを実行すると、目的のSQL(テスト済)が生成されるため、単純にアップグレードして具体的な問題はなくなります。

しかし、改善とともに、新しいリリースではバグや回帰が導入されることに注意してください(例えば、 EFCoreが単純なLEFT OUTER結合のために多すぎる列を返しているのを見てください)ので、あなた自身の責任でそれをやり直してくださいあなたのためにどちらが正しいか :)



Related

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