我在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(); ;
当我退出时,你想在应用所有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 };
}