Linq的延遲載入問題

2021-09-06 18:01:09 字數 4150 閱讀 7377

什麼是延遲載入:所謂延遲載入就是當在真正需要資料的時候,才真正執行資料載入操作。可以簡單理解為,只有在使用的時候,才會發出sql語句進行查詢,資料是分n次讀取。

classinfo表:

stuinfo表:

2個表的關係就不要我多說了

一、接下來看延遲載入**:

linqdbdatacontext db = new

linqdbdatacontext();

db.deferredloadingenabled = true;//

true表示延遲載入,預設就是延遲載入,所以本句**可以省略

~/log/log.txt");

db.log =sw;

//建立linq to sql語句

var list = from s in

db.classinfo

select

s;

//編輯sql語句

foreach (var c in

list)

,班級名稱:

", c.classid, c.classname);

response.write(s1);

foreach (var mark in

c.stuinfo)

,姓名:

", mark.stunum, mark.stuname);

response.write(s2);}}

db.log.flush();

db.log.close();

輸出的結果是:

班級id:1,班級名稱:t1001

學號:s001,姓名:張小三

學號:s004,姓名:王五

學號:s006,姓名:小明

學號:s007,姓名:郭曉明

學號:s009,姓名:張寶

班級id:2,班級名稱:t1002

學號:s002,姓名:李四

學號:s003,姓名:小麗

學號:s008,姓名:張潔

學號:s011,姓名:王燕

學號:s012,姓名:王勝

班級id:3,班級名稱:t1003

學號:s005,姓名:趙六

學號:s010,姓名:陳明

班級id:4,班級名稱:t1004

學號:s013,姓名:王倩

日誌輸出的內容如下:

select [t0].[classid], [t0].[classname]

from [dbo].[classinfo] as [t0]

-- context: sqlprovider(sql2008) model: attributedmetamodel build: 4.0.30319.18058

select [t0].[stunum], [t0].[stuname], [t0].[stuage], [t0].[stu***], [t0].[classid]

from [dbo].[stuinfo] as [t0]

where [t0].[classid] =@p0

-- @p0: input int (size = -1; prec = 0; scale = 0) [1

]-- context: sqlprovider(sql2008) model: attributedmetamodel build: 4.0.30319.18058

select [t0].[stunum], [t0].[stuname], [t0].[stuage], [t0].[stu***], [t0].[classid]

from [dbo].[stuinfo] as [t0]

where [t0].[classid] =@p0

-- @p0: input int (size = -1; prec = 0; scale = 0) [2

]-- context: sqlprovider(sql2008) model: attributedmetamodel build: 4.0.30319.18058

select [t0].[stunum], [t0].[stuname], [t0].[stuage], [t0].[stu***], [t0].[classid]

from [dbo].[stuinfo] as [t0]

where [t0].[classid] =@p0

-- @p0: input int (size = -1; prec = 0; scale = 0) [3

]-- context: sqlprovider(sql2008) model: attributedmetamodel build: 4.0.30319.18058

select [t0].[stunum], [t0].[stuname], [t0].[stuage], [t0].[stu***], [t0].[classid]

from [dbo].[stuinfo] as [t0]

where [t0].[classid] =@p0

-- @p0: input int (size = -1; prec = 0; scale = 0) [4

]-- context: sqlprovider(sql2008) model: attributedmetamodel build: 4.0.30319.18058

通過日誌可以看出來,外層的foreach是遍歷classinfo,產生了查詢classinfo的一句日誌,裡層foreach是遍歷每個classinfo裡面的stuinfo,由於有4個班,要查詢4個classinfo裡面的stuinfo

,所以會產生4句日誌。這種情況就是真正需要資料時,才進行查詢。

二、接下來看立即載入的**:

linqdbdatacontext db = new

linqdbdatacontext();

db.deferredloadingenabled = false;//

false表示立即載入

~/log/log.txt");

db.log =sw;

//立即載入模式(下面3句**一定要加,否則學生資訊查不到資料)

dataloadoptions dl = new

dataloadoptions();

dl.loadwith

(s =>s.stuinfo);

db.loadoptions =dl;

//建立linq to sql語句

var list = from s in

db.classinfo

select

s;

//編輯sql語句

foreach (var c in

list)

,班級名稱:

", c.classid, c.classname);

response.write(s1);

foreach (var mark in

c.stuinfo)

,姓名:

", mark.stunum, mark.stuname);

response.write(s2);}}

db.log.flush();

db.log.close();

輸出來的結果和上面的一樣,但是我們看看日誌資訊:

select [t0].[classid], [t0].[classname], [t1].[stunum], [t1].[stuname], [t1].[stuage], [t1].[stu***], [t1].[classid] as [classid2], (

select count(*)

from [dbo].[stuinfo] as [t2]

where [t2].[classid] =[t0].[classid]

) as [value]

from [dbo].[classinfo] as [t0]

left outer join [dbo].[stuinfo] as [t1] on [t1].[classid] =[t0].[classid]

order by [t0].[classid], [t1].[stunum]

-- context: sqlprovider(sql2008) model: attributedmetamodel build: 4.0.30319.18058

很明顯立即載入,是一次性進行查詢讀取出來的。

Linq之延遲載入特性

寫在前面 系列文章 延遲載入 總結上篇文章介紹了linq中常見的幾個關鍵字,並列舉了幾個例子,算是對linq如何使用有了初步了解。上篇文章中也提到了,能夠使用linq的場合有乙個要求 實現ienumerable泛型介面,或者型別相容 可以通過cast方法轉換,比如arraylist linq之lam...

Linq之延遲載入特性

寫在前面 系列文章 延遲載入 總結上篇文章介紹了linq中常見的幾個關鍵字,並列舉了幾個例子,算是對linq如何使用有了初步了解。上篇文章中也提到了,能夠使用linq的場合有乙個要求 實現ienumerable泛型介面,或者型別相容 可以通過cast方法轉換,比如arraylist linq之lam...

延遲載入的問題

當使用ssh框架進行開發的時候,有時候因為延遲載入的問題可能有些資料不能顯示出來,這個時候spring框架提供l了乙個過濾器,通過新增這個過濾器就可以解決延遲載入的問題。在web.xml中配置如下 使用的是hibernate4 opensessioninviewfilter org.springfr...