繁体   English   中英

如何使用Linq在Telerik Mvc网格中绑定前20条记录?

[英]How to bind top 20 records in Telerik Mvc Grid using Linq?

我在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);
          })
    )

这是一个简单的例子。

导入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(); ;

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

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

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

$('.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 };

}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM