【问题标题】:DevExpress MVC Gridview + LINQDevExpress MVC 网格视图 + LINQ
【发布时间】:2012-01-25 16:55:42
【问题描述】:

我们在专门设计的视图中呈现了一个 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);
}

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

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

【问题讨论】:

    标签: c# linq asp.net-mvc-3 devexpress aspxgridview


    【解决方案1】:

    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()
    

    【讨论】:

    • 您发布的第一个 URL devexpress.com/issue=Q333116 包含一个示例项目,该项目似乎实际上利用自己的逻辑生成 LINQ 查询以使用分页/排序/过滤参数。是否可以进行“基本” linq 查询(IQueryable myLinqObject = from dbContext.myTable 中的 s)并让 gridview 在数据库端执行查询之前自动附加这些参数?如果可能的话,我想避免为此实现我自己的逻辑 - 我假设 BindToLINQ() 函数本身附加了诸如 Take、Skip 等操作。
    • 当然。当使用 BindToLINQ 方法(我提到的两种方法中的任何一种)时,GridView 会自行执行相应的 LINQ 命令(Take、Skip 等)。即无需手动执行。只需使用您/我提供的代码并通过 SQL Server Profiler 检查所需的查询。
    【解决方案2】:

    似乎对象类型应该是 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;})
    

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

      • 我正在考虑类似的事情,但我不知道您是否能够影响 DX 的分页参数,例如告诉它最多有 100 个页面,而传递的集合仅包含 10 个对象。客户端 DX Gridview 组件是否也传递可读参数,例如正在对哪一列进行排序等?更重要的是,这个解决方案不是让使用 DX 的 Gridview 组件变得毫无意义吗?
      猜你喜欢
      • 2019-03-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-02-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多