c linq裡的Skip和Take處理分頁筆記

2021-08-08 17:58:36 字數 1513 閱讀 8068

take()

take 運運算元是擴充自 ienumerable 的方法,只需傳入乙個 int 型別的引數,表示要取回的專案個數。當 take 運運算元被呼叫時,會從**序列的第乙個專案開始,依序取回指定數量的專案當做結果回傳。

skip()

skip 運運算元和 take 運運算元正好相反,它可用來跳過**序列中的前幾個專案,再把剩下的資料全部回傳。

用法

這兩個函式可以直接在c#中用來做分頁處理。但是兩個函式的順序不能反。不然容易引發資料混亂的問題。最好是先用source.skip().take()。也可以先將source.tolist(),然後進行skip().take()。因為先list()的話,會執行sql查詢返回有序的結果集。這樣查詢變不會出錯。

sql關鍵字執行順序

這兩個函式對應的查詢

source.take().skip()對應的sql:

select *,row_number() over(order

by [col]) as row_number from (select * from (

select * from (from

"a"where ()) "project1"

order

by"project1"."[col]"

)where (rownum <= num )) "project2"

where ("project2"."row_number" > 0)

order

by"project2".[col] desc

source.skip().take()對應的sql:

select * from 

(select rownum num, *,row_number() over(order

by [col]) as row_number from

"project1"

where ("project1"."row_number" > num)

order

by"project1"."[col]" )

where (rownum <= num )

現在開始考慮兩個函式的先後順序,首先,每次select的時候都會產生乙個rownum,並且按順序排列。如果source.skip().take(),那麼是首先得到乙個按日期排序,並按照row_number篩選的結果集。第二個查詢又會重新生成乙個rownum,同樣也是個順序排列的新的rownum,然後再依據num進行篩選。如果source.take().skip(),先排序之後查詢rownum,生成第二次rownum時再篩選,此時的結果已經是混亂的了。所以下面無論怎麼操作幾乎都是錯誤的。因此這兩個函式使用時,需要注意順序。不然分頁之後的資料就很容易混亂。

Linq的Skip和SkipWhile詳細介紹

int arr var query arr.skip 5 console.writeline 去除前五個 foreach var item in query console.write nskipwhile的用法 n var query2 arr.skipwhile val val 5 foreac...

dd下的seek和skip命令

假如我有乙個檔案abc.gz,大小為83456k,我想用dd命令實現如下備份結果 首先將備份分成三個部分,第一部分為備份檔案abc.gz的前10000k,第二部分為中間的70000k,最後備份後面的3456k.備份方法如下三條命令 dd if abc.gz of abc.gz.bak1 bs 1k ...

C 中Skip和Take的用法

宣告 僅為個人理解,有空請參觀 迷戀自留地 skip 和take 方法都是ienumerable介面的擴充套件方法,包括c 中的所有collections類,如arraylist,queue,stack等等,還有陣列和字串都可以呼叫這兩個方法。vartestlist newlist int 比如 t...