0

我在我的 ASP.NET MVC3 应用程序中使用 Telerik Grid 来显示我的记录。

问题是在我的数据库中我有数百万条记录。因此,由于性能问题,我不想一次绑定所有记录。所以我需要一个逻辑,所以我可以先绑定 20 条记录。请记住,我的过滤器/排序不仅适用于 20 条记录,还适用于整个数据库。

实际上我关心的是性能,因为我的查询返回了所有数百万条记录,当我只需要在网格中显示 20 条或可能是 30 条时,为什么要返回所有数百万条记录。所以我想节省不需要的加载时间

谢谢

这是我的行动

[GridAction]
    public ActionResult AjaxBibHierarchy()
    {
        return View(new GridModel(GetCommands()));

    }

    private IQueryable<BibViewModel> GetCommands()
    {
        var bib = (from a in db.Bibs
                   join inf in db.InfoTypes
                   on a.InfoTypeId equals inf.Id
                   where a.Status == "A"

                   select new BibViewModel
                   {
                       Title = db.BibContents.Where(x => x.TagNo == "245" && x.Sfld == "a").Select(y => y.NormValue).FirstOrDefault(),
                       Author = db.BibContents.Where(x => x.TagNo == "100" && x.Sfld == "a").Select(y => y.NormValue).FirstOrDefault(),
                       Id = a.Id,
                       Type = inf.Type,
                       InfoType = inf.Description,
                       Contents = "",
                       CreatedOn = a.CreatedOn

                   });
        return bib;

    }

看法

  @(Html.Telerik().Grid<Vibrant.Areas.Cataloging.Models.BibViewModel>()
                            .Name("Bib")
    .DataKeys(keys => keys.Add(c => c.Id))
    .DataBinding(dataBinding => dataBinding
        .Ajax()

        )
    .Columns(columns =>
    {

        columns.Bound(o => o.Id).Hidden(true);
        columns.Bound(o => o.Title).Width(300).Title("Title");
        columns.Bound(o => o.Author).Width(120).Title("Author");
        columns.Bound(o => o.InfoType).Width(120).Title("InfoType");
        columns.Bound(o => o.CatalogueDate).Width(120).Title("Cat.Date").Format("{0:yyyy-MM-dd}");
        columns.Bound(o => o.CreatedOn).Width(120).Title("Created On").Format("{0:yyyy-MM-dd}");

    })
    .Sortable()
    .Groupable()

                 .DataBinding(dataBinding => dataBinding.Server().Select("BibIndex", "Bib"))
                    .DataBinding(dataBinding => dataBinding.Ajax().Select("AjaxBibHierarchy", "Bib").Enabled(true))
                                       .Scrollable(x => x.Height("auto"))
                                                      .Sortable(x => x.OrderBy(y => y.Add(z => z.CreatedOn).Descending()))
          .Pageable(page =>
          {
              page.PageSize(10);
          })
    )
4

2 回答 2

0

这是一个简单的例子。

导入System.Linq命名空间

 var procs = (from p in System.Diagnostics.Process.GetProcesses()
                     where p.ProcessName.StartsWith("s") // filter if needed. 
                     select new
                     {
                         Name = p.ProcessName,
                         Title = p.MainWindowTitle
                     }).Take(20).ToList(); ;
于 2013-07-10T09:37:54.973 回答
0

正如我 Undrestood 一样,您希望在应用所有 Telerik 过滤器后获取 20 条记录。一种简单的方法(确实可以解决)是将页面大小设置为 20,然后禁用页脚:

        .Pageable(page =>
    {
        page.PageSize(20);
    }).Footer(false)

或者如果您不想禁用页脚,只需使用 dist 简单技巧删除分页栏:

$('.t-pager','#YourGridId').remove();

编辑 :

您的视图模型可以这样启动:

@model IEnumerable<CommandGridViewModel>
@(Html.Telerik().Grid(Model)
        .Name("GridCommands")
        .DataKeys(keys =>
        {
            keys.Add(c => c.Id);
        })
        .Pageable(page =>
        {
            page.PageSize(10);
        })

     ...

    .DataBinding(dataBinding =>
    {
        dataBinding.Server()
            .Select("Index", "Commands");

        dataBinding.Ajax()
            .Select("AjaxIndex", "Commands").Enabled(true);
    })

并且您的 ajaxIndex 操作可以是这样的:

[GridAction]
public ViewResult AjaxIndex()
{
   return View(new GridModel(GetCommands()));
}
private IQueryable<CommandGridViewModel> GetCommands()
{
   return from r in contenxt.Commands
          select new { r.Id , r.Name , r.Status , r.Type };

}
于 2013-07-10T19:36:11.343 回答