一、導航屬性數據加載
1.在EF Core中可以使用導航屬性來加載相關實體。
2.加載實體的三種方式:
(1)預先加載:直接在查詢主體時就把對應的依賴實體查出來(作為初始查詢的一部分)
(2)顯式加載:使用代碼指示稍后顯式的從數據庫中加載數據
(3)延遲加載:在訪問導航屬性時,以透明的方式加載關聯數據
二、數據預加載
1.關聯查詢:直接使用導航屬性就可以訪問關聯數據,但是不能直接以“.”去調用導航屬性的數據,否則會報錯,如示例代碼所示:
運行:
原因是這里的導航屬性Post只是起到一個完成約定配置的作用,其本身在主體數據加載時并不會自動加載關聯數據。
要通過導航屬性來訪問數據,需要在DbSet的Include()方法來加載子數據。Include()接收兩種與導航屬性相關的參數。第一種是要加載的導航屬性名的字符串,第二種是直接通過Lambda表達式來進行加載:
Lambda:
屬性字符串:
運行:
2.多層級數據訪問:可以通過多次調用Include()方法實現深層數據加載,以省市縣數據為例:
省:
市:
縣區:
在程序中使用Include與ThenInclude來實現多層級的數據加載:
運行:
注意:使用Include加載數據只是指定在加載主體的時候把依賴實體一并帶出來并賦值,返回的實體依舊是最開始指定的DbSet。例如上面返回的就還是Province省,但是省內的市級與縣級數據也會被一并查詢出來。
三、使用Include進行數據過濾
1.在使用Include進行數據加載時,默認會加載主體實體所包含的所有依賴實體。但是某些時候我們不需要查詢出所有的依賴實體,而是只需要加載我們感興趣的數據即可。
例如,在上面的省-市-縣三級聯動查詢中,假如我只想查詢遼寧省大連市的所有數據,那么就需要在調用Include()時指定數據過濾。否則它將會加載整個遼寧省的數據。
2. 在調用Include()方法時,可以使用Where等方法進行數據過濾,同時可以對依賴實體進行排序等操作。
運行: