我正在使用带有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会完成其余的工作。但那不适合我。
也许我做错了什么,或者这甚至不可能?
答案 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
类。