0

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

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

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

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

网格通过 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(); })))

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

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

但是当我进一步检查发送到数据库的 SQL 命令时,我发现只有 SELECT 命令存在,没有 WHERE,没有 ORDER by,什么都没有,这会降低我的所有数据。

我想知道分页/排序/过滤是否可以自动工作,或者我是否需要自己将网格发送的信息转换为 SQL 命令。我的印象是,我所需要的只是提供 IQueryable,其余的由 Grid 完成。但这对我不起作用。

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

4

1 回答 1

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类。

于 2012-10-12T16:09:31.410 回答