所謂ef延遲載入,就是使用lamabda或linq查詢資料時,ef並不會將資料直接查詢出來,而是在用到的這個查詢結果的時候才會載入到記憶體中。延遲載入也可以理解成 按需載入,顧名思義,就是按照所需的資料,載入資料。那麼為什麼要使用延遲載入?使用延遲載入的優缺點是什麼?下面通個幾個例子來說明。
首先用到了兩張非常簡單的表
t_artcle 文章表,t_user使用者表,用userid作為外來鍵關聯,插入下面的資料
insert into t_user values('nee32')
insert into t_artcle values('test title',1)
然後新建乙個控制台應用程式,匯入這兩張表,注意新增表的時候把確定所生成物件名稱的單複數形式勾上
一、ef中的查詢where與集合list中的where的區別
ef中的where
ef中的where返回的是乙個iqueryable,我們再寫乙個list集合,看看返回的是什麼
奇怪,都是where方法,但是返回的結果卻完全不一樣,原因是因為集合的查詢方法where是來自system.linq.enumerable裡給ienumerable介面新增的擴充套件方法,而ef上下文中的dbset裡的查詢方法where來自system.linq.queryable裡給iqueryable介面新增的擴充套件方法,雖然都是呼叫的where方法,但是這兩個方法完全不一樣。因為iqueryable這個介面,所以就支援延遲查詢。
二、即時查詢與延遲查詢
1、即時查詢
首先在執行查詢的時候打乙個斷點
再用 sql server profiler監聽 執行的sql
可以看到,執行完斷點就馬上查詢了資料庫,所以上面的查詢是即時的
2、延遲查詢
我們改一下上面的**
設定斷點再用 sql server profiler監聽,發現斷點之前並沒有執行任何sql
只有在用到使用它的時候 t_user user = query.firstordefault()
延遲查詢的優點:例如有乙個部落格查詢頁面,上面有發布時間、關鍵字、分類等查詢條件,當查詢條件個數不確定的時候,where並沒有立即去查詢資料庫,而是把所有的條件都確定好之後,才根據這些where條件生成一條相應的sql去查詢資料庫。
3、外來鍵實體的延遲載入
本質:對與外來鍵屬性,ef會在用到這個外間屬性的時候才去查詢相應的表
先在edm實體模型中看下使用者與文章的關係
生成的類**如下:
public partial class t_artclepublic string title
public int userid
public virtual t_user t_user
}
public partial class t_useredmx 幫我們生成了相應的主外來鍵關係public int id
public string username
public virtual icollectiont_artcle
}
例如,查詢出 文章表 id為1的 的文章使用者
static void main(string args)在console.writeline(artcle.t_user.username);這一行設定斷點,使用 sql server profiler監聽一下
這裡只是查詢了文章表,並沒有查詢使用者表,繼續逐步執行
這個時候ef去用使用者表了,因為這裡用到了文章表的外來鍵屬性,程式輸出 nee32
完
EF延遲載入 懶載入
關於ef懶載入英文翻譯lazyload也俗稱延遲載入 只有是 導航屬性 並且 類是public 字段必須用virtual 才能用延遲載入,ef預設是延遲載入的,什麼是延遲載入呢?延遲載入就是當需要用到集合的時候才會去資料庫取資料,有點是什麼呢?優點就是按需取資料提高了載入的速度,缺點是需要多次執行s...
EF 延遲載入技術
延遲載入 優點 只在需要的時候載入資料,不需要預先計畫,避免了各種複雜的外連線 索引 檢視操作帶來的低效率問題 使用方式 兩步 第一 在需要延遲載入的屬性前加上virtual 該屬性的型別可以是任務的集合型別icolloct或者是0 1.1關聯屬性。如 publicvirtuallistproduc...
EF延遲載入LazyLoading
只在需要的時候載入資料,不需要預先計畫,避免了各種複雜的外連線 索引 檢視操作帶來的低效率問題 阻止延遲載入解決方案 1 tolist 返回的東西是個記憶體級的物件,就是說強迫它在這裡執行了一次sql語句,查詢到的東西被放在web伺服器記憶體裡了,這樣可以達到快取的效果,這就阻止了延遲載入 2 在建...