[英]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.