LINQ提公升效率的方法

2021-08-31 14:03:27 字數 4835 閱讀 5877

1.使用延遲。

(1)延遲執行和立即執行:延遲執行不僅僅是linq to sql獨有的,基本上所有的linq都具有此特性,它能提高效率讓我們在適當的時間執行適當的查詢,如果在某些特殊的情況下不想使用此特性可以使用 tolist() or toarray()方法讓該查詢立即執行。

示例1:延遲執行01 northwnddatacontext dc = new northwnddatacontext();

02 dc.log = console.out;

03 var query = from c in dc.customers

04 select c; oracle 連線錯誤;ora-27101: shared memory realm does not exist

05 console.writeline("this is deferred execute.");

06 07 foreach (var item in query)

08

結果:this is deferred execute.

select [t0].[customerid], [t0].[companyname], [t0].[contactname], [t0].[contactt

itle], [t0].[address], [t0].[city], [t0].[region], [t0].[postalcode], [t0].[coun

try], [t0].[phone], [t0].[fax]

from [dbo].[customers] as [t0]

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

alfki

示例2:不延遲執行01 northwnddatacontext dc = new northwnddatacontext();

02 dc.log = console.out;

03 var query = (from c in dc.customers

04 select c).tolist();

05 console.writeline("this is not deferred execute.");

06 07 foreach (var item in query)

08

結果:select [t0].[customerid], [t0].[companyname], [t0].[contactname], [t0].[contactt

itle], [t0].[address], [t0].[city], [t0].[region], [t0].[postalcode], [t0].[coun

try], [t0].[phone], [t0].[fax]

from [dbo].[customers] as [t0]

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

this is not deferred execute.

alfki

(注意黃色標註的位置,就能很清楚延遲和普通執行的區別了)

(2)延遲載入和立即載入:在c#**中往往會使用物件例項的屬性去和其他物件建立關係(customer.order),但有時我們需要同時需要乙個完整的物件鏈的資訊,往往只要當前物件的資訊,因此我們能通過延遲載入和立即載入來實現不同的需求。

(通過dataloadoptions例項去實現 )

例項1:延遲載入01 var query = (from c in dc.customers

02 select c).tolist();

03 04 foreach (var item in query)

05

12 console.readkey();

13 }

結果:select [t0].[customerid], [t0].[companyname], [t0].[contactname], [t0].[contactt

itle], [t0].[address], [t0].[city], [t0].[region], [t0].[postalcode], [t0].[coun

try], [t0].[phone], [t0].[fax]

from [dbo].[customers] as [t0]

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

alfki

this is deferred load.

select [t0].[orderid], [t0].[customerid], [t0].[employeeid], [t0].[orderdate], [

t0].[requireddate], [t0].[shippeddate], [t0].[shipvia], [t0].[freight], [t0].[sh

ipname], [t0].[shipaddress], [t0].[shipcity], [t0].[shipregion], [t0].[shipposta

lcode], [t0].[shipcountry]

from [dbo].[orders] as [t0]

where [t0].[customerid] = @p0

-- @p0: input nvarchar (size = 4000; prec = 0; scale = 0) [alfki]

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

10643

...例項2:立即執行01 northwnddatacontext dc = new northwnddatacontext();

02 dc.log = console.out;

03 04 dataloadoptions lo = new dataloadoptions();

05 lo.loadwith(c => c.orders);

06 dc.loadoptions = lo;

07 08 var query = (from c in dc.customers

09 select c).tolist();

10 11 foreach (var item in query)

12

19 console.readkey();

20 }

結果:select [t0].[customerid], [t0].[companyname], [t0].[contactname], [t0].[contactt

itle], [t0].[address], [t0].[city], [t0].[region], [t0].[postalcode], [t0].[coun

try], [t0].[phone], [t0].[fax], [t1].[orderid], [t1].[customerid] as [customerid

2], [t1].[employeeid], [t1].[orderdate], [t1].[requireddate], [t1].[shippeddate]

, [t1].[shipvia], [t1].[freight], [t1].[shipname], [t1].[shipaddress], [t1].[shi

pcity], [t1].[shipregion], [t1].[shippostalcode], [t1].[shipcountry], (

select count(*)

from [dbo].[orders] as [t2]

where [t2].[customerid] = [t0].[customerid]

) as [value]

from [dbo].[customers] as [t0]

left outer join [dbo].[orders] as [t1] on [t1].[customerid] = [t0].[customerid]

order by [t0].[customerid], [t1].[orderid]

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

alfki

this is deferred load.

10643

...(同樣可以看到2者的差別,注意使用這種延遲載入,要在對應的實體類裡為要做對映的類使用entityref和entityset包裝,

對實體類對映的某個欄位做延遲載入要使用link包裝)

2.編譯查詢:往往乙個查詢表示式要被重複使用很多次,如果每次都反覆的生成表示式樹,然後生成sql語句勢必開銷很大,效率很低。因此可以使用編譯查詢,它把不變的部分編譯好,把需要改變的部分再進去就ok了。

示例:view source

print

?01 //編譯查詢核心

02 var query1 = compiledquery.compile((northwnddatacontext dc1, string initialchar) =>

03 from c in dc1.customers

04 where c.customerid.startswith(initialchar)

05 select c);

06 07 foreach (var item1 in new )

08 ", item.customerid);

14 }

15 }

提公升爬蟲效率的方法

任務物件 事件迴圈 特殊函式內部不能寫不支援非同步請求的模組,如time,requests.否則雖然不報錯但實現不了非同步 import asyncio import time start time time.time async def get request url await asyncio....

提公升工作效率的方法

有計畫地使用時間 設定的目標要明確 具體 有可實現性 區分優先順序以及輕重緩急 將每天的工作順序排列出來 每件事都有具體的時間結束點 聽從生理時鐘辦事 效果與效率之間進行選擇 區分緊急事務與重要事務 不要想成為完美主義者 學會拒絕 利用零碎時間 part one 建立時間管理觀念 工作時間愈長,效率...

提公升工作效率的方法

番茄工作法 打好清單,集中注意力做眼前的事,無疑效率是最高的。工作最怕的就是被不停的打斷,不同任務切換再適應所花的時間完全被浪費掉了。而25分鐘正好是乙個節點,來個番茄鐘嘗試一下吧。至於 番茄工作法 為什麼會火,可能和心理有關係。畢竟大部分人都願意相信努力是有回報的,當然我也是。google工作整理...