2012-06-19 128 views
1

我有一個ASP.NET MVC 4項目和一個SQL視圖(vvItem)。 ItemControllerASP.NET MVC Webgrid高效分頁

MVCAppEntities db = new MVCAppEntities(); 
    public ActionResult Index() 
    { 
     var itemqry = db.vvItem.OrderBy(s => s.name); 
     //var pageditems = itemqry.Skip(10).Take(20); // 25 seconds 
     return View(itemqry.ToList()); // 88 seconds 
    } 

Index.cshtml查看

@model IEnumerable<MVCApplication1.Models.vvItem> 
@{ 
    var norows = 20; 
    var grid = new WebGrid(Model, canPage: true, rowsPerPage: norows); 
    grid.Pager(WebGridPagerModes.NextPrevious); 
    @grid.GetHtml(tableStyle: "table", headerStyle: "header", columns: grid.Columns(
      grid.Column(columnName: "name", header: "Name", canSort: true), 
      grid.Column(columnName: "quantity", header: "Quantity", canSort: true), 
      grid.Column(columnName: "code", header: "Code", canSort: true), 
      grid.Column(columnName: "Price", header: "Price", canSort: true), 
     ))} 

在vvItem我幾乎40萬的記錄。我認爲webgrid Pager將只加載(Take())顯示的記錄,並且如果我將進入下一頁,它將知道Skip()第一個記錄。

問題:我如何有效地使視圖只加載顯示的記錄?

我發現2個解決方案:JSON versionNerdDinner

我不太擅長JSON,所以我試過的NerdDinner解決方案。正如在我的註釋行 //var pageditems = itemqry.Skip(10).Take(20); itemqry已經加載了所有的記錄,並且它花了很多時間來加載。

Q2:現在該如何做分頁?我需要修改頁面號。從Index方法。

public ActionResult Index(int? page, string filter1 = " ", string filter2 = " ") 
+0

在NerdDinner範例例如他們會兌現的X視圖不itemqry。 –

+0

我將x重命名爲pageditems。正如您在Skip-Take中看到的那樣,花了25秒而沒有88秒 – Misi

+0

對於問題2,它將在控制器中進行管理,如NerdDinner示例中所示,並在user1439338下面發佈。您的觀點必須計算頁數並管理頁面鏈接。在NerdDinner鏈接底部顯示的專用視圖模型是一種好方法。 – Turnkey

回答

2

我做的函數導入存儲過程

CREATE PROCEDURE SkipTake 
    @pagNo int, 
    @pageSize int 
AS  
    select * 
    from (select *, row_number() over (order by COD) as rn 
      from vvSTOC 
     ) as T 
    where T.rn between (@pagNo - 1) * @pageSize + 1 and @pagNo * @pageSize 

一個SQL我已經在我的EF模型添加了此SP,以便它返回一個實體(vvSTOC)

public ActionResult Index(int? page) 
    { 
     const int pageSize = 20; 
     return View(db.spSkipTake(page, pageSize).ToList()); 
    } 
+0

這是SP版本。如果您有其他解決方案,請填寫。 – Misi

+0

db對象是如何定義的? – Turnkey

+0

我有一個SQL表和一個SQL視圖(該視圖顯示來自該表的行加上來自另一個表的一些不重要的數據(約1000條記錄)),記錄約爲400.000條。你想查看視圖和表格的SQL腳本嗎? – Misi

1

只要itemqry是IEnumerable或IQueryable類型,它就不應該立即執行查詢。你可以像下面這樣將它轉換爲IQueryable嗎?

public ActionResult Index() 
{ 
    IQueryable<vvItem> itemQry = db.vvItem; 
    return View(itemQry.OrderBy(s => s.name).Skip(10).Take(20).ToList()); 
} 

如果itemqry是將它轉換爲一個IList類型的正確類型它不會直到.ToList執行()被調用。檢查正在生成的SQL是否確定。

+0

你在我的回覆中寫下了我評論過的內容。我在1分半鐘時間內沒有跳過()和跳轉()並且在25秒時跳過()和跳過()。在SQL中,從同一個表中,如果我寫入TOP 1000,它將在1秒內返回1000行 – Misi

+0

如果將鼠標懸停在Visual Studio上,它是什麼類型的變量? – Turnkey

+0

{System.Data.Objects.ObjectQuery } – Misi

0
public ActionResult Index(int? pageIndex) 
{ 
    int pageSize = 20; 
    var itemIndex = ((pageIndex??1) -1) * pageSize; 

    return View(db.vvItem.OrderBy(s => s.name).Skip(itemIndex).Take(pageSize).ToList()); 
}