DevExpress MVC网格视图+LINQ

本文关键字:+LINQ 视图 网格 MVC DevExpress | 更新日期: 2023-09-27 18:21:29

我们有一个DX网格视图,它是在一个专门设计的视图中呈现的。我们传递一个预定义的ViewModel对象,其值是从Linq-2-Entities查询中填充的。问题是,在我们的回调函数中,L2E查询实际上是在DevExpress网格执行任何过滤、排序和分页之前在DB上执行的。IE.:(简化示例,在实际情况下,我们从几个表中选择数据,但仍然在一个linq查询中)

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

在这种情况下,查询实际上是在数据传递到视图之前执行的。因此,它实际上从数据库中选择了太多的数据,而网格视图只显示所选的页面。

我们必须如何修改查询,使其只选择用户选择的页面的数据?IE。当用户选择第2页时,跳过10行并在L2E查询中取10,而不是选择100000行(如果表中有那么多行),然后应用过滤/排序/分页,就像在所描述的情况中一样?

DevExpress MVC网格视图+LINQ

MVC GridView扩展通过内部LinqServerModeDataSource对象在功能上支持所谓的"服务器模式"。

它需要IQueryable对象作为数据源:

直接LINQ查询:

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; }

LinqToX DataCotnext/Classes中的表/视图;

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

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

为了让DevExpress的gridview有效地使用其Linq-DB命令,对象类型似乎应该是System.Linq.IQueryable。在您的控制器内,建立您的逻辑并将您的Linq查询传递到View:

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;})

我会在数据访问层/级别实现分页/排序/过滤,只返回需要显示的内容,因为您注意到的网格可以显示正确的页面,但这种情况发生在客户端,所有内容都总是从数据库加载,除非你使用他们的XPO ORM(我没有)并启用网格服务器模式(至少这是他们的windows窗体和ASP.NET网格中的概念)。

问题的答案是,您应该将LINQ查询设计为接受页面大小和页面索引作为参数,并从您需要的特定页面索引中执行Take(pageSize)。所有这些也可以在数据库上的存储过程中直接完成。