2011-12-16 69 views
5

我正在使用實體框架一段時間,但仍然有一些「黑洞」與它如何在引擎蓋下工作。即使閱讀了幾篇文章後,我也不確定我的理解是否正確。瞭解引擎蓋下的EF。包括vs加入


讓我們開始提問:

  • EF包括如何引擎蓋下工作?
  • 加入和包含有什麼區別?
  • 包含的性能問題(延遲加載vs預先加載,生成的SQL查詢等)?
  • 當我應該使用Join而不是Include時,反之亦然?

回答

9

當通過linq或lambda表達式查詢EF時,如果底層架構不提供FK,並且因此您沒有對象的導航屬性,則只需要連接語句。

另一方面,包含(加載加載)和延遲加載只有在存在FK時纔會起作用,因爲它使用導航屬性。

兩種情況下的底層sql都將使用連接(因爲sql沒有「導航屬性」概念)。

至於性能,這取決於情況。延遲加載vs預先加載(所以在FK場景中)可能是一個困難的選擇。

我通常使用延遲加載,當你有一個很大的主結果時很有用,但是你只需要「加入」整個結果集的幾個項目的數據。

如果您事先知道需要整個結果集的連接數據,那麼熱切加載可能會更好地提高性能。我建議你去嘗試一下,看看你自己。

+0

謝謝你的回答,但仍然需要更精確的東西。 – 2011-12-27 20:20:09