У меня есть 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);
И я немного растерялся относительно того, в чем проблема:
- Я неправильно установил параметры подкачки jqgrid?
- Я написал плохой Linq, который тянет все строки независимо от?
например, Sum () вызывает чтение всех строк?
- Неправильно ли я сделал .Skip (). Take ()?
- Я совсем что-то пропустил?
EDIT
При сравнении моего кода с примером, опубликованным Олегом, я вижу, что я делаю вещи в следующем порядке:
- GETALL
- выбор полей модели
- страница
Образец Wheas Olegs выглядит следующим образом:
- GETALL
- страница
- выбор полей модели
Так что я перешел на эту гораздо более простую реализацию:
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...
Единственное отличие, которое я вижу сейчас с примером Олега, состоит в том, что его getAll возвращает IQueryable
, где у меня просто List
.