C # MVC2 Jqgrid - как правильно сделать пейджинг на стороне сервера? - PullRequest
1 голос
/ 16 ноября 2010

У меня есть 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

При сравнении моего кода с примером, опубликованным Олегом, я вижу, что я делаю вещи в следующем порядке:

  1. GETALL
  2. выбор полей модели
  3. страница

Образец Wheas Olegs выглядит следующим образом:

  1. GETALL
  2. страница
  3. выбор полей модели

Так что я перешел на эту гораздо более простую реализацию:

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.

1 Ответ

1 голос
/ 16 ноября 2010

Вы должны опубликовать более полный код. Например, model.ToGridData не определено в текущем коде. Как вы рассчитываете index из входных патраметров и так далее, также неясно. Только имея model.ToGridData(), можно сказать, соответствуют ли выходные данные, создаваемые вашей программой, jsonReader, который вы определяете.

Я рекомендую вам посмотреть этот старый ответ, где используются как разбиение на страницы, так и сортировка. В еще одном ответе вы найдете больше ссылок на примеры кода.

...