C# MVC2 Jqgrid – как правильно выполнять подкачку на стороне сервера?C#

Место общения программистов C#
Anonymous
C# MVC2 Jqgrid – как правильно выполнять подкачку на стороне сервера?

Сообщение Anonymous »

У меня есть 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()?
  • Я пропустил что-то еще?
РЕДАКТИРОВАТЬ

Когда сравнивая мой код с примером, опубликованным Олегом, я вижу, что делаю все в следующем порядке:
  • getAll
  • выбрать поля модели
  • страница
А вот образец Олега, похоже, находится здесь заказать:
  • getAll
  • страница
  • выбрать модель поля
Поэтому я перешел на гораздо более простую реализацию:

Код: Выделить всё

public ActionResult GetProductList(int page, int rows, string sidx, string sord,
string searchOper, string searchField, string searchString)
{
List
 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.

Подробнее здесь: https://stackoverflow.com/questions/418 ... ide-paging

Вернуться в «C#»