我们在一个专门设计的视图中呈现了一个DX网格视图。我们传递一个预定义的ViewModel对象,该对象的值是从Linq-2实体查询中填充的。问题是,在我们的回调函数中,L2E查询实际上是在DevExpress网格执行任何过滤、排序和分页之前在DB上执行的。例如:(简化的示例中,在实际情况下,我们从多个表中选择数据,但仍在单个linq查询中)
public ActionResult GridViewPartial(string myParameters)
{
var modelData = from s in db.myTable
select new { modelName = s.Name };
return PartialView("GridViewPartial", modelData);
}在这种情况下,查询实际上是在数据传递到View之前执行的。因此,它实际上从数据库中选择了太多的数据,而网格视图只显示所选的页面。
我们如何修改查询,使其只选择用户所选页面的数据?即。当用户选择第2页时,在L2E查询中跳过10行并取10行,而不是选择100000行(如果表中有那么多行),然后应用过滤/排序/分页,就像所描述的情况一样?
发布于 2012-01-26 22:41:13
MVC GridView扩展通过内部LinqServerModeDataSource对象在功能上支持所谓的“server mode”。
它需要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()发布于 2012-01-26 17:33:51
对象类型似乎应该是System.Linq.IQueryable,以便DevExpress的gridview能够有效地使用其Linq DB命令。在您的控制器内部,构建您的逻辑并将Linq查询传递给View:
System.Linq.IQueryable modelData = from s in db.myTable
select new { modelName = s.Name };
return PartialView("GridViewPartial", modelData);在Razor视图中,使用以下命令启动网格视图:
@model System.Linq.IQueryable
@Html.DevExpress().GridView(...).BindToLINQ((string)null, null, (s, e) => { e.KeyExpression = "Table_id"; e.QueryableSource = Model;})发布于 2012-01-26 01:00:05
我将在数据访问层/层实现分页/排序/过滤,并只返回需要显示的内容,因为网格可以显示正确的页面,但这发生在客户端,并且所有内容总是从数据库加载,除非您使用他们的XPO (我不使用)并启用网格服务器模式(至少这是他们的windows forms和ASP.NET网格中的概念)。
问题的答案是,您应该将LINQ查询设计为接受页面大小和页面索引作为参数,并从所需的特定pageIndex中执行Take(pageSize)。所有这些也可以直接在db上的存储过程中完成。
https://stackoverflow.com/questions/9006643
复制相似问题