Table Storage對分頁的支援

2021-08-25 04:48:33 字數 3474 閱讀 7236

大家可能知道wcf data services最新版提供了server paging的功能,意即在服務期端對資料進行分頁,從而限制傳回客戶端的資料量。那麼windows azure table storage是否提供分頁功能呢?

windows azure table storage本身就限制了客戶端一次性可以訪問的資料量不能超過100條。當你需要訪問的資料量超過100條時,只有前100條資料會被返回至客戶端。同時response會包含乙個x-ms-continuation-nextpartitionkey和x-ms-continuation- nextrowkey (通稱continuation token),它代表著第101條資料的key。在後續的請求中,你可以將之前或取得continuation token通過query string傳遞給table storage,從而取得第101至第200條資料。

同理,當你使用take這個query string強制限制返回的資料量時,continuation token也會被包含於response中。

使用過新版本wcf data services的server paging功能的使用者應該清楚如何在客戶端程式中控制continuation token,從而對資料進行分頁。在table storage中,你也可以使用類似的方式。只不過用法稍有不同。有關continuation token的基本用法,請參考

然而你或許很快會發現server paging的侷限性。是的,server paging的作用主要在於限制客戶端一次性可以訪問的資料量,而不在於幫助客戶端構建起分頁導航的功能。通過continuation token,你可以方便地取得下乙個頁面的資料。但是如果你要反過來取得之前乙個頁面的資料,就不那麼簡單了……

通常客戶端的分頁導航功能需要client paging來實現。例如,在wcf data services中,你可以通過skip和take這樣的query string來要求服務返回從特定的起始點到特定的終結點的資料。然後很遺憾,table storage是不支援skip的,於是也就無法完整地使用client paging。

乙個部分的解決方法是,你必須手工儲存乙個continuation token的列表。只要有了continuation token,我們就可以要求table storage從特定的記錄開始返回。至於如何儲存continuation token的列表,方式是多種多樣的。以下演示如何將歷史記錄資訊儲存在cookie中,從而在asp.net中實現分頁導航功能。

mvc的controller(控制導航邏輯):

publicactionresultindex()

using(memorystreamstream =newmemorystream())

catch

if(history ==null)

storagecredentialsaccountandkeycredential =newstoragecredentialsaccountandkey("[account]","[key]");

cloudstorageaccountaccount =newcloudstorageaccount(credential,false);

cloudtableclienttableclient =newcloudtableclient(account.tableendpoint.tostring(), account.credentials);

customerservicecontextctx =newcustomerservicecontext(account.tableendpoint.tostring(), account.credentials);

varquery = (dataservicequery)(ctx.customer.take(10));

//將currentpage傳入query string。

stringcurrentpage = request["currentpage"];

intcurrentpagenumber = 0;

if(!string.isnullorempty(currentpage))

stringaction = request["action"];

if(action =="previous")}

elseif(action =="next")

}varres = query.execute();

varqor = (queryoperationresponse)res;

stringnextpartition =null;

stringnextrow =null;

qor.headers.trygetvalue("x-ms-continuation-nextpartitionkey",outnextpartition);

qor.headers.trygetvalue("x-ms-continuation-nextrowkey",outnextrow);

if(nextpartition !=null&& nextrow !=null)

/", nextpartition, nextrow);

}varresult = res.tolist();

varfirstentity = result.first();

//將新的continuation token新增到歷史記錄中,如果它尚不存在的話……

stringhistoryentry =string.format("/", firstentity.partitionkey, firstentity.rowkey);

if(!history.contains(historyentry))

//序列化成json。

stream.position = 0;

serializer.writeobject(stream, history);

stream.position = 0;

using(streamreaderreader =newstreamreader(stream))

viewdata["currentpagenumber"] = currentpagenumber;

viewdata["result"] = result;

returnview();}}

}mvc的view(顯示previous/next導航):

&action=previous'>previous

¤tpage=<%=viewdata["currentpagenumber"]%>&action=next'>next

當然,這種方式也是有侷限性的。例如,使用者無法從中間某個頁面開始訪問資料,必須從第一頁開始訪問,從而能夠建起乙個continuation token的歷史記錄。由於table storage不支援count,我們也無法顯示總共有幾個頁面。這是server paging的侷限性,通常server paging被用於限制客戶端一次性最多能訪問多少資料,從而避免一些可能因資料量太多而發生的問題(諸如連線超時)。要構建起完整的分頁導航功能,還需要client paging的支援。然而在目前table storage只支援server paging的情況下,上述解決方案讓你能夠構建起基本的分頁導航功能。

lucene針對分頁文字的檢索和檢索結果定位問題

首先,索引一些文件的全文,在搜尋 電腦科學 時,首先,根據檢索詞可以找到命中的所有文件,有沒有辦法獲取到對某個命中的文件中所有的檢索關鍵字的上下文資訊?就像在word中進行搜尋時,會在目錄中高亮顯示在那些節有檢索詞,並返回共有多少個匹配項。就是需要先定位到文件,然後還要定位到文件中的位置資訊。用lu...

相對分子質量

小明最近迷上了化學,幾乎天天在實驗室做實驗,但是很多實驗生成的化學產物的相對分子質量令他很困惑,不知如何計算,請你程式設計幫他計算。輸入的第一行是乙個正整數n,表示有n組測試資料。接下來n行每行輸入乙個字串,表示某個分子式,分子式中只包含大寫字母和數字。注意 輸入資料只包含8種元素,而這8種元素的相...

相對分子質量

小明最近迷上了化學,幾乎天天在實驗室做實驗,但是很多實驗生成的化學產物的相對分子質量令他很困惑,不知如何計算,請你程式設計幫他計算。輸入的第一行是乙個正整數n,表示有n組測試資料。接下來n行每行輸入乙個字串,表示某個分子式,分子式中只包含大寫字母和數字。注意 每個分子式長度沒超過20.輸入資料只包含...