2017-03-21 23 views
1

結果返回我已經寫在ASP.NET MVC 4的應用程序,我有一個要求,從oledbdatareader訪問的表返回較大的結果。大型查詢如何在部分C#/ ASP.NET MVC 4

我使用AJAX來返回包含列表的JsonResult對象:List<TableRow>

我不明白的是,如果我在DataReader的循環

using (OleDbDataReader reader = command.ExecuteReader()) 
{ 
    while (reader.Read()) 
    { 
     names.Add(Convert.ToString(reader[0])); 
    } 
} 

有沒有辦法定期發送列表對象,然後創建一個新的對象來拾取並繼續?

+0

有什麼要求用於顯示數據?是否有原因導致您無法使用具有分頁功能的表格(網格),以便用戶可以調整返回到10,25,50或100行的數據量,然後單擊箭頭來回翻頁? – Flea

+0

我可以使用一個網格,但問題是,我正在尋找一種方法來發送數據包,而不是一次填充數據結構,然後將它傳遞給客戶端。之前並沒有真正做到過,所以我期待看看web應用程序的正常過程是什麼,但我可能只是依靠SignalR併爲此付出一些代價。 – eaglei22

回答

0

從技術上講,服務器只能對每個請求返回一個響應,所以沒有辦法做你想做的事情(缺少設置某種瘋狂套接字的東西)。

我會翻轉你正在做的事情,並以1000(或任何大小)的批量將你的javascript請求的數據集組塊分塊,並讓它在請求下一個塊時開始渲染。

更好的是,你可以在你的用戶界面中實現某種形式的無限滾動,這樣下一個塊只會被及時請求顯示,這樣你就不會向客戶端發送不需要的數據。

+0

至於瘋狂的套接字的東西,也許我可以使用「SignalR」來處理,但我寧願不依賴那個,然後找到一個替代方案。因此,對於批量數據集請求,這是更難的表,因爲表是不索引(也許我可以要求做到這一點),但我不知道如何溝通停止和開始每個新的查詢(如果我理解正確)最終,我想阻止數據結構變得太大。如果我可以得到每一行的ID。我只是可能會這樣做的範圍。 – eaglei22

0

我想你已經是相當普遍實現幾個選項。如果您需要將10000條記錄返回給客戶端,則可以在MVC應用程序中對其進行管理。如果您使用Entity Framework和Linq,則可以編寫業務邏輯,每當用戶單擊下一個按鈕時就發回100行。這將保持傳輸到客戶端很小,甚至可以保持從Web服務器到SQL服務器的呼叫很小。

如果您不想讓用戶單擊下一個按鈕(即分頁),但希望做到無限滾動樣式,那麼只需執行相同的操作,就像用戶不斷滾動一樣,只需一直調用Ajax方法一次發回100行。

Web服務器和數據庫服務器是不會嗆到10000條記錄;它會窒息到客戶端。即使你在Signal R中打開一個套接字,我想你應該問自己我是否真的需要一次向客戶端推送10,000行?

想想在手機上的Twitter的應用程序,他們爲您滾動數據發送給你,他們沒有一次發送這一切。這有幫助嗎?

更新的基礎上就其直接的SQL

這裏您的評論是在SQL做分頁的簡單版本的例子:

DECLARE @intStartRow int; 
DECLARE @intEndRow int; 

SET @intStartRow = (@intPage -1) * @intPageSize + 1; 
SET @intEndRow = @intPage * @intPageSize;  

WITH blogs AS 
    (SELECT strBlogName, 
    ROW_NUMBER() OVER(ORDER BY intID DESC) as intRow, 
    COUNT(intID) OVER() AS intTotalHits 
    FROM tblBlog) 
SELECT strBlogName, intTotalHits FROM blogs 
WHERE intRow BETWEEN @intStartRow AND @intEndRow 

來源:http://joelabrahamsson.com/my-favorite-way-to-do-paging-with-t-sql/

+0

感謝您的反饋!我沒有使用實體框架,我正在使用OleDbConnection。用戶:arychj,提到了關於無限滾動的相同內容。因爲我正在使用OleDbConnection,所以我很困惑這是如何工作的。你是否有一個簡單的例子來提供,如果這可能與OleDbConnection。 – eaglei22

+0

@ eaglei22 - 你在調用存儲過程嗎? – Flea

+0

沒有存儲過程,只是一個帶準備語句的標準SQL字符串。 – eaglei22