2012-03-22 45 views
2

今天我遇到了一些奇怪的事情。ctx.Object.Select和obj.Select之間的EF差異

我使用mini-profiler查看執行的SQL查詢。

似乎在使用obj.Children.Select(x => x.Prop1).SingleOrDefault()時,執行的查詢將獲得所有列。 但是,使用ctx.Children.Select(x => x.Prop1 & & x.IDParent == idObj).SingleOrDefault()僅獲取Prop1。

任何想法爲什麼區別?

+0

你不是指在那裏有一個Where語句嗎? – 2012-03-22 15:10:45

+0

我在這兩種情況下都有一席之地。但我沒有想到它包括它...... – ra00l 2012-03-22 18:14:55

回答

2

因爲第一個查詢獲取此執行:

obj.Children. ... 

而第二個查詢獲取此excuted:

... .SingleOrDefault() 

你得到充分的實體先查詢所有列,因爲導航屬性由於延遲加載而被加載。在實體加載後,您的Select將應用於內存中。當您投影到單個屬性時,此時數據庫查詢已經完成。

第二個查詢在數據庫中真正執行投影(選擇單個列),並且不加載超過此列。

+0

Slauma,感謝您的答案。這說得通。 – ra00l 2012-03-22 18:15:11