2012-03-22 2 views
2

今日私は少し奇妙なものに遭遇しました。ctx.Object.Selectとobj.Selectの間のEFの差

ミニプロファイラを使用して実行されたSQLクエリを確認しました。

obj.Children.Select(x => x.Prop1).SingleOrDefault()を使用すると、実行されたクエリはすべての列を取得するようです。 しかし、ctx.Children.Select(x => x.Prop1 & & x.IDParent == idObj).SingleOrDefault()はProp1のみを取得します。

違いは何ですか?

+0

あなたはそこに 'Where'句を持っていないのですか? –

+0

私は両方の場合にどこにいたのですか。しかし、私はそれがそれを含めることに関連しているとは思わなかった... – ra00l

答えて

2

最初のクエリは、ここで実行されますので:

obj.Children. ... 

をそして2番目のクエリは、ここにexcutedます:

... .SingleOrDefault() 

あなたはナビゲーションプロパティので、すべての列との完全なエンティティの最初のクエリを取得します遅延ロード遅延ロードのためにロードされます。エンティティがロードされた後、Selectがメモリに適用されます。データベースクエリは、単一のプロパティに投影する時点で既に終了しています。

2番目のクエリは、実際にデータベース内で投影(1つの列を選択)を実行し、この列を超えてロードしません。

+0

スラウマ、答えに感謝します。それは理にかなっている。 – ra00l

関連する問題