私は最近、DBAの強い不承認にもかかわらず、プロジェクトにEntityFrameworkを使用しました。それである日、彼は私のオフィスに来て、自分のデータベースに到達する生成されたT-SQLについて不平を言いました。
たとえば、IDに基づいて商品を選択する場合は、次のように記述します。
context.Products.FirstOrDefault(p=>p.Id==id);
これは
SELECT ... FROM (SELECT TOP 1 ... FROM PRODUCTS WHERE ID=@id)
それで彼は「一体なぜあなたはSELECT*FROM(SELECT TOP 1)を書くのか」と叫んでいます。
だから私は私のコードをに変更しました
context.Products.Where(p=>p.Id==id).ToList().FirstOrDefault()
これにより、はるかにクリーンなT-SQLが生成されます。
SELECT ... FROM PRODUCTS WHERE ID=@id
内部クエリとTOP1が消えました。十分に混乱しているので、私の質問はこれです:最初のクエリは本当にSQL Serverにオーバーヘッドをかけますか?2番目の方法よりも解析が難しいですか?Id列には、クラスター化インデックスがあります。彼の顔(または私のもの)にそれをこすりつけることができるように、私は良い答えが欲しいです
ありがとう、
Themos