2016-04-01 2 views
2

Я просто хотел получить некоторый вклад сообщества в отношении наблюдения, которое я сделал во время работы над проектом, в котором использовались таблицы данных JQuery для представления данных, которые будут извлекать данные из веб-интерфейса настройки проект.JQuery Datatables и .NET WebAPI Соображения производительности

Таким образом, учитывая цену коды на контроллере Web API, который возвращает список пользователей (GetAllUsers) - с помощью хранилища шаблона:

будет возвращать список пользователей, которые могут варьироваться от количество записей, таких как от 10 до 10000.

Однако из наблюдения мы будем потреблять на переднем конце и обрабатывать возвращаемые данные как таковые. Это означает, что такие задачи, как пейджинг, поиск, фильтрация и сортировка, обрабатываются клиентом, используя указанный плагин (JQuery datatable).

Независимо от точки входа данных на клиент, будь то через вызов Ajax или контроллер MVC, по существу, передача данных клиенту будет представлять собой весь набор записей (из которых может варьироваться до сотен и тысяч) при каждой загрузке конкретной страницы, которая может ее запросить.

Глядя на настройки и инициализации JQuery DataTables к точке и довольно прямо вперед:

$(document).ready(function() { 
     var table = $('#reportTable').DataTable({ 
      responsive: true, 
      "bServerSide": false, 
      "sAjaxSource": "GetRefugeeApplicant", 
      "processing": false, 
      "bFilter": true, 
      "sDom": "lrtip" 
     }); 

В качестве таких, пейджинга задач, фильтрации, сортировки и поиска становятся довольно легко рассмотреть. Однако проблема возникает в производительности на начальной загрузке страницы, поскольку по мере роста таблицы данных число записываемых записей уменьшается. Чтобы уточнить, существует ли 1000 записей пользователей, тогда все 1000 пользователей будут сведены к концу клиента и приведут к большему количеству накладных расходов при первоначальном вызове, так как такие задачи, как поиск подкачки, поиск и фильтрация, не делают вызовы на сервер и работают с какими данными был снят первоначальный запрос.

Таким образом, вопрос, который возникает здесь, становится тем, кто задает вопрос о том, было бы или невозможно загрузить все данные клиенту и работать на стороне клиента с указанными данными или, альтернативно, иметь вызовы API, которые будут передавать пейджинговые задачи на стороне сервера существенно вытащить фиксированное количество записей - скажем, 10 - клиенту. Как такой:

public IHttpActionResult GetAllPersons(Guid id, int page = 0, int pageSize = 0, string searchQuery = "", string orderBy = "") 
     { 
      var response = ResponseMessage(new HttpResponseMessage(HttpStatusCode.InternalServerError)); 
      var personList = new Person(Uow).GetAllPersons(searchQuery); 
      if (personList == null) return response; 
      var totalCount = personList.Count; 
      var totalPages = (int)Math.Ceiling((double)totalCount/pageSize); 

      switch (orderBy) 
      { 
       default: 
        personList = personList.OrderBy(c => c.PersonId).ToList(); 
        break; 
      } 

      personList = personList 
       .Skip(pageSize * page) 
       .Take(pageSize) 
       .ToList(); 

      var result = new 
      { 
       personList, 
       pagingDetails = new 
       { 
        totalPages, 
        totalCount, 
        prevLink = "", 
        nextLink = "", 
        currentCount = personList.Count 
       } 
      }; 

      var responseMessage = Request.CreateResponse(HttpStatusCode.OK, new JsonResponseObject 
      { 
       Data = result, 
       Message = "Person Details Retrieved Successfully.", 
       IsSuccessful = true 
      }); 

      response = ResponseMessage(responseMessage); 
      return response; 
     } 

Однако такой подход (1) не будет корректно работать с JQuery DataTables из-за лицом он будет возвращаться только число строк, необходимых и не все строки, которые, как правило, нужно будет работать «в -memory "с. (2), используя этот подход, будет означать, что при каждом вызове поискового вызова в зависимости от клиента вам нужно будет поразить сервер для выполнения задач запроса.

Итак, я немного разделен в голове, что касается наилучшего решения, и если бы мне пришлось использовать JQuery Datatables на стороне клиента, есть ли какие-либо другие соображения производительности, чтобы смотреть на другие, о котором я говорил.

Благодаря

ответ

0

Вы не хотите, чтобы тянуть больше данных для своего клиента, чем у вас есть разумное ожидание использования в данной сессии.

Эта ситуация - вот что такое вещи, как OData. Он обеспечивает стандартизованный способ обработки таких вещей, как сортировка, пейджинг и фильтрация данных между клиентом и API.

Веб.API имеет support для OData, а также ряд компонентов JavaScript.

0

Определенно рекомендую осуществлять подкачку и фильтрацию на стороне сервера. Я использую Datatables поверх WebApi именно так, и он отлично работает с хорошей производительностью.

Однако точка предостережения в вашем примере: как вы реализовали GetAllPersons конечной точку, он будет читать все записи из базы данных в памяти:

var personList = new Person(Uow).GetAllPersons(searchQuery); 

Тогда он будет применять пейджинг:

personList = personList 
       .Skip(pageSize * page) 
       .Take(pageSize) 
       .ToList(); 

Это будет несколько быстрее, потому что вы не отправляете все данные клиенту, но вы должны применить пейджинг к запросу, чтобы вы читали только текущую страницу из db и запрашивали общее количество записей в виде Count. Это можно сделать в хранимой процедуре, которая возвращает таблицу и скалярное значение, но несколько сложнее сопоставить это с EF, а не с «чистым» шаблоном репозитория.

Смежные вопросы