2012-01-27 53 views
3

當使用devexpress gridview的bindtoLINQ功能時,它會查詢整個表集而不是客戶端正在查看的頁面。DevExpress MVC GridView BindToLINQ()選擇太多數據

IE。使用SQL Server Profiler,我們看到它選擇表中,而不只是預期的10

視圖中的200K +行的所有列如下:

@Html.DevExpress().GridView(...).BindToLINQ("MyProject.Models.DBEntities", "myTable", (s, e) => { e.KeyExpression = "row_id"; }).GetHtml() 

網格不來了格式良好的客戶端,但由於它似乎選擇了我的表內的整個數據集,客戶端執行的任何類型的操作都會表現得太差 - 只要進入下一個頁面大約需要幾分鐘。 15秒。爲什麼gridview不使用LIMIT和pagerow來僅選擇客戶端可見的必要數據?它只是在選擇完整的表格內容後才使用Linq Skip和Take命令。

這是另一種方式,我嘗試過,但它的行爲類似於:

// the ActionResult function inside my controller: 
public ActionResult GridViewPartial() { 
    DBEntities dbEntities = new DBEntities(); 
    var myLinqQuery = from s in dbEntities.myTable select new { s.row_id, s.row_username }; 

    return PartialView("GridViewPartial", myLinqQuery); 
} 

// inside the Razor view: 
@model IQueryable 
@Html.DevExpress().GridView(...).BindToLINQ("", "", (s, e) => { e.KeyExpression = "row_id"; e.QueryableSource = Model; }).GetHtml() 

另外,使用綁定(),而不是BindToLINQ()做同樣的事情:

// inside the Razor view: 
@model IQueryable 
@Html.DevExpress().GridView(...).Bind(Model).GetHtml() 

回答

4

不要檢索數據在控制器端。

請在PartialView側這一操作:

@Html.DevExpress().GridView(...).BindToLINQ("", "", (s, e) => { 
    e.KeyExpression = "row_id"; 

    DBEntities dbEntities = new DBEntities(); 
    var myLinqQuery = from s in dbEntities.myTable select new { s.row_id, s.row_username }; 

    e.QueryableSource = myLinqQuery; 
}).GetHtml() 

的GridViewPartial行動應只返回PartialView對象:

public ActionResult GridViewPartial() { 
    return PartialView("GridViewPartial"); 
}