Asp.net mvc 使用Telerik MVC扩展网格在数据库服务器上分页

Asp.net mvc 使用Telerik MVC扩展网格在数据库服务器上分页,asp.net-mvc,telerik,Asp.net Mvc,Telerik,Telerik此功能: 基于Linq的表达式引擎,用于将网格操作(分页、排序、筛选和分组)推送到数据库服务器 但如何实现它呢?这些示例都以IEnumerable或其他内容为例。这取决于您将数据发送到视图的方式。如果将linq查询保留为lazy求值,那么将在数据库上进行分页。但是,如果在数据层中执行ToList()或其他枚举,则会忽略这一点,即提取所有数据,并且必须设置一些设置来手动分页 为了更好地展示 // In your initial page load public ActionResul

Telerik此功能:

基于Linq的表达式引擎,用于将网格操作(分页、排序、筛选和分组)推送到数据库服务器


但如何实现它呢?这些示例都以IEnumerable或其他内容为例。

这取决于您将数据发送到视图的方式。如果将linq查询保留为lazy求值,那么将在数据库上进行分页。但是,如果在数据层中执行ToList()或其他枚举,则会忽略这一点,即提取所有数据,并且必须设置一些设置来手动分页

为了更好地展示

// In your initial page load
public ActionResult Index()
{
    return View(new MyViewModel
    {
        // ... other view data

        // set order or .Where for initial load, but don't use .ToList or enumerate
        MyObjects = _db.MyObjects.OrderBy(m => m.Name)
        // When this is passed into the grid, it will finalize the paging there
        // and when the grid enumerates MyObjects, it will only pull the relevant
        // items from the database.
    });
}
如果您使用的是ajax绑定

// In an ajax grid responder action
[GridAction]
public ActionResult AjaxGridAction()
{
    // Assuming _db is a CodeFirst DbContext, GridModel will handle filtering,
    // paging, and sorting in the database as linq applies those methods to the
    // IQueryable _db.MyObjects
    return View(new GridModel(_db.MyObjects));
}
如果您使用的是存储库模式(尽管DbContext实际上已经是一个存储库),那么让它返回惰性对象:

public IEnumerable<T> GetMyObjects()
{
    // Don't use ToList or enumerate them in your repository - that will
    // pull all the data before the Telerik grid has filtered it.
    return _db.MyObjects;
}

对于服务器分页/排序,您应该设置GridOperationMode.serverprop

有一个使用的示例:

Html.Telerik().Grid<PartnerUserViewModel>()
    .Name("Grid").DataBinding(binding =>    binding.Ajax().OperationMode(GridOperationMode.Server).Select("GetUsers", "Partner")).Columns(columns =>
    {
        columns.Bound(o => o.Representer).Title("Representer");  
    });          
    .Sortable(sorting => sorting.OrderBy(sortOrder => sortOrder.Add(p => p.DateCreated).Descending()))
    .Filterable()
    .Pageable(pager => pager.Position(GridPagerPosition.Both).PageSize(5))
    .Groupable()
Html.Telerik().Grid()
.Name(“Grid”).DataBinding(binding=>binding.Ajax().OperationMode(GridOperationMode.Server)。选择(“GetUsers”,“Partner”))。Columns(Columns=>
{
columns.Bound(o=>o.Representer).Title(“Representer”);
});          
.Sortable(sorting=>sorting.OrderBy(sortOrder=>sortOrder.Add(p=>p.DateCreated.Descending()))
.可过滤()
.Pageable(pager=>pager.Position(GridPagerPosition.Both).PageSize(5))
.Groupable()

谢谢,所以我想他们会在封面下检查IEnumerable是否是IQueryable。解释它。干杯,皮特。他们真的不需要检查——这就是林克的乐趣。IEnumerable的具体部分将是进行分页的部分。在Telerik代码中,他们只使用.Skip(page).Take(pageSize)。具体的实现者DbSet或其他IQueryable负责将其实际转换为SQL。由于Linq是惰性计算的,直到.ToList或其他.To_uuuu,传递到网格中的集合还没有被提取,可以在数据数据库中分页。Telerik代码将调用相同的代码,而不管具体的类型是什么,并且它不必做任何不同的事情。例如,db.Customers.AsEnumerable().Take(10)仍将从数据库中获取所有客户。简要查看源代码,Telerik检查IEnumerable是否已经是Telerik.Web.Mvc.Infrastructure.QueryableFactory中的IQueryable。
_db.MyObjects
    .Select(o => new MyObjectsViewModel { // manually map properties, ewww });
Html.Telerik().Grid<PartnerUserViewModel>()
    .Name("Grid").DataBinding(binding =>    binding.Ajax().OperationMode(GridOperationMode.Server).Select("GetUsers", "Partner")).Columns(columns =>
    {
        columns.Bound(o => o.Representer).Title("Representer");  
    });          
    .Sortable(sorting => sorting.OrderBy(sortOrder => sortOrder.Add(p => p.DateCreated).Descending()))
    .Filterable()
    .Pageable(pager => pager.Position(GridPagerPosition.Both).PageSize(5))
    .Groupable()