我有一个 jqgrid,其中数据库表有几千行,但 jqrid 一次只显示 15 行。
它应该显示得非常快(查询 15 行并不需要很长时间)。 但它需要 10 - 20 秒,这表明它每次都检索整个表。
网格定义如下:
$("#Products").jqGrid({
url: url, mtype: "get", datatype: "json", jsonReader: {
root: "Rows", page: "Page", total: "Total", records: "Records", repeatitems: false,
userdata: "UserData",id: "Id"},
colNames: ["Product Id","Product Code", ... etc ],
colModel: [{ name: "Id", ... etc}],
viewrecords: true, height: 400, width: 800, pager: $("#jqgPager"),
rowNum: 15, rowList: [50, 100, 200],
autowidth: true, multiselect: false
服务器端(MVC2 操作)执行以下操作:
var model = (from p in products
select new
{
p.Id, p.ProductCode, p.ProductDescription,
AllocatedQty = p.WarehouseProducts.Sum(wp => wp.AllocatedQuantity),
QtyOnHand = p.WarehouseProducts.Sum(wp => wp.OnHandQuantity)
}).AsQueryable();
JsonResult json = Json(model.ToGridData(
page, rows, orderBy, "",
new[] { "Id", "ProductCode", "ProductDescription", "AllocatedQty", "QtyOnHand" }),
JsonRequestBehavior.AllowGet);
最后 model.ToGridData 扩展方法执行以下操作:
var data =_service.GetAll();
var page = data.Skip((index) * pageSize).Take(pageSize);
list.Add(page.AsEnumerable);
我有点不知道问题出在哪里:
编辑
将我的代码与 Oleg 发布的示例进行比较时,我可以看到我按以下顺序执行操作:
Wheras Olegs 样本似乎是按这个顺序排列的:
所以我改变了这个更简单的实现:
public ActionResult GetProductList(int page, int rows, string sidx, string sord,
string searchOper, string searchField, string searchString)
{
List<Product> products = _productService.GetAllProducts();
int totalRecords = products.Count();
var pagedData = products.Skip((page > 0 ? page - 1 : 0) * rows).Take(rows);
var model = (from p in pagedData
select new
{
p.Id, p.ProductCode, p.ProductDescription,
Barcode = string.Empty, UnitOfMeasure = string.Empty,
p.PackSize, AllocatedQty = string.Empty,
QtyOnHand = string.Empty }).ToList();
var jsonData = new
{
total = page, records = totalRecords,
page = (totalRecords + rows - 1) / rows, rows = model
};
return Json(jsonData, JsonRequestBehavior.AllowGet);
}
然而这又带来了一个新问题:
A circular reference was detected while serializing an object of type
'System.Data.Entity.DynamicProxies.Product_FA935D3899E2...
我现在能看到 Oleg 样本的唯一区别是他的 getAll 返回
IQueryable
,而我的只是 List
。