2012-01-25 161 views
1

我們有一個DX gridview在一個專門設計的視圖中呈現。我們傳遞一個預定義的ViewModel對象,其值從Linq-2-Entities查詢中填充。問題是在我們的回調函數中,在DevExpress網格執行任何過濾,排序和分頁之前,L2E查詢實際上是在數據庫上執行的。 IE:(簡化的例子,在實際情況下,我們選擇從幾個表,但仍然在一個單一的LINQ查詢數據)DevExpress MVC Gridview + LINQ

public ActionResult GridViewPartial(string myParameters) 
{ 
    var modelData = from s in db.myTable 
            select new { modelName = s.Name }; 

    return PartialView("GridViewPartial", modelData); 
} 

在這種情況下,數據已被傳遞到前查看實際執行查詢。因此,它實際上從數據庫中選擇太多的數據,而gridview只顯示選定的頁面。

我們將如何修改查詢,使其只選擇用戶選擇的頁面數據? IE瀏覽器。在用戶選擇第2頁時,跳過10行並在L2E查詢中取10,而不是選擇100000行(如果表中有許多),然後應用過濾/排序/分頁,就像所描述的情況一樣?

回答

4

的MVC GridView的擴展支持等等 - 在功能上通過內部LinqServerModeDataSource對象稱爲「server mode」。

它要求的IQueryable對象作爲數據源:

直接LINQ查詢:從LinqToX DataCotnext /類

http://www.devexpress.com/issue=Q333116

@Html.DevExpress().GridView(...).BindToLINQ(string.Emptry, string.Emptry, (s, e) => { e.KeyExpression = Key_Column_Here; e.QueryableSource = Linq_Query_Here; } 

表/視圖;

http://mvc.devexpress.com/GridView/DataBindingToLargeDatabase

@Html.DevExpress().GridView(...).BindToLINQ(Data_Context_Name_Here, Table_View_Name_Here).GetHtml() 
+0

您發佈的第一個URL http://www.devexpress.com/issue=Q333116包含一個示例項目,該項目似乎實際使用自己的邏輯來生成LINQ查詢以使用分頁/排序/過濾參數。是不是可以做一個「基本」linq查詢(IQueryable myLinqObject =從dbContext.myTable中的s),並讓gridview在數據庫端執行查詢之前自動追加這些參數?如果可能的話,我想避免實現我自己的邏輯 - 我假設BindToLINQ()函數附加了諸如Take,Skip等自身的操作。 – L2Eer

+0

當然。當使用BindToLINQ方法(我提到的兩種方法)時,GridView本身執行相應的LINQ命令(Take,Skip等)。 即,不需要手動執行它。 只需使用您提供的代碼並通過SQL Server Profiler檢查所需的查詢。 – Mikhail

1

我會在數據訪問層/層實現分頁/排序/過濾,並且只返回需要顯示的內容,因爲您注意到的Grid可以顯示正確的頁面,但是這發生在客戶端並且所有內容都始終加載從數據庫中,除非你使用他們的XPO ORM(我沒有)並且啓用網格服務器模式(至少這是他們的windows窗體和ASP.NET網格中的概念)。

你的問題的答案是,你應該設計你的LINQ查詢來接受參數頁面大小和頁面索引,並從你需要的特定pageIndex做一個Take(pageSize)。所有這些也可以直接在db上的存儲過程中完成。

+0

我想類似的東西,但我不知道,如果你能夠影響DX的分頁參數,例如告訴它有一個最大的100頁的同時通過收集僅持有10個對象。客戶端DX Gridview組件是否也傳遞可讀參數,如正在對哪個列進行排序等?更重要的是,這個解決方案不會使DX的Gridview組件變得毫無意義嗎? – L2Eer

3

看來對象類型應該是System.Linq.IQueryable,以便DevExpress的gridview有效地使用它的Linq DB命令。內部控制器,建立你的邏輯,並通過您的LINQ查詢視圖:

System.Linq.IQueryable modelData = from s in db.myTable 
           select new { modelName = s.Name }; 

return PartialView("GridViewPartial", modelData); 

裏面的Razor視圖,開始在GridView用命令:

@model System.Linq.IQueryable 
@Html.DevExpress().GridView(...).BindToLINQ((string)null, null, (s, e) => { e.KeyExpression = "Table_id"; e.QueryableSource = Model;})