什麼是延遲載入:所謂延遲載入就是當在真正需要資料的時候,才真正執行資料載入操作。可以簡單理解為,只有在使用的時候,才會發出sql語句進行查詢,資料是分n次讀取。
classinfo表:
stuinfo表:
2個表的關係就不要我多說了
一、接下來看延遲載入**:
linqdbdatacontext db = newlinqdbdatacontext();
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 = newlinqdbdatacontext();
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...