Telerik MVC Grid和数据库中的分页/排序/过滤

时间:2012-10-11 12:29:53

标签: c# sql-server entity-framework telerik-grid telerik-mvc

我正在使用带有AJAX绑定的Telerik Grid MVC。

我认为如果我向网格提供IQueryable,则会在数据库服务器上完成分页/排序/过滤。像这样:

[GridAction]
public ActionResult Select()
{
    return View(new GridModel(Mapper.Map<IEnumerable<DokumentVM>>(db.Dokumenti)));        
}

我在数据库中创建了大约10000个文档的测试数据,并且上面的命令导致每个文档都被拖入网格中。显然,它需要永远。

Grid通过AJAX绑定,如下所示:

@(Html.Telerik().Grid<ViewModels.DokumentVM>()
.DataBinding(b => b.Ajax().Select("Select", "Dokument"))
.Pageable(p => p.PageSize(20))
.Sortable(s => s.SortMode(GridSortMode.MultipleColumn).OrderBy(m => { m.Add("Date").Descending(); m.Add("Number").Descending(); })))

内部选择ActionMethod,在检查Request(其表单)时,我看到网格发送正常运行所需的所有信息:

page:     1
size:     20
orderBy:  Date-desc~Number-desc

但是当我进一步检查发送到数据库的SQL命令时,我看到只有SELECT命令存在,没有WHERE,没有ORDER,没有任何东西,这导致了我的所有数据。

我想知道Paging / Sorting / Filtering是否可以自动运行,或者我是否需要自己将网格发送的信息转换为SQL命令。我的印象是,我所需要的只是提供IQueryable,Grid会完成其余的工作。但那不适合我。

也许我做错了什么,或者这甚至不可能?

1 个答案:

答案 0 :(得分:1)

问题是使用AutoMapper!当你拨打这一行时:

 return View(new GridModel(Mapper.Map<IEnumerable<DokumentVM>>(db.Dokumenti)));

首先,AutoMapper尝试将所有db.Dokumenti行转换为内存函数中的新形式。之后,映射的数据传递给GridModel。有关分页和排序的所有内容都发生在这个类中。

因此,您应避免在此级别使用AutoMapper并使用其他策略。例如,您可以进行如下查询:

var q= from r in db.Dokumenti select new DokumentVM(){ ... }

然后将q变量传递给GridModel类。