2009-12-15 3 views
0

Я использую jqGrid для отображения данных, которые извлекаются с помощью NHibernate. jqGrid делает paging для меня, я просто говорю NHibernate, чтобы получить «счетные» строки, начиная с «n».jqGrid/NHibernate/SQL: перейти к выбранной записи

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

Проблема в том, что этот сотрудник может находиться на не текущей странице. Например. Я показываю 20 строк из 0, но «выделенный» сотрудник - № 25 и находится на второй странице.

Можно передать начальную страницу в jqGrid, поэтому, если я каким-то образом использую NHibernate, чтобы найти, на какой странице включен «выделенный» сотрудник, он просто перейдет к этой странице, а затем я буду использовать .setSelection (id) метод jqGrid.

Итак, проблема сужается до этого: учитывая конкретный поисковый запрос, подобный приведенному ниже, как я могу сообщить NHibernate, чтобы вычислить страницу, где «подчеркнул» сотрудник?

Образец запроса (упрощенный):

var query = Session.CreateCriteria<T>(); 
foreach (var sr in request.SearchFields) 
    query = query.Add(Expression.Like(sr.Key, "%" + sr.Value + "%")); 
query.SetFirstResult((request.Page - 1) * request.Rows) 
query.SetMaxResults(request.Rows) 

Здесь, мне нужно изменить (рассчитать) request.Page так, что она указывает на страницу, где находится request.SelectedId.

Кроме того, одна интересная вещь: если порядок сортировки не определен, получаю ли я те же результаты, когда я дважды запускаю поисковый запрос? Я бы сказал, что SQL Server может оптимизировать запрос, потому что порядок не определен ... в этом случае я получаю только ожидаемый результат, если я вытащил ВСЕ данные запроса один раз, а затем программно на C# указанная часть результатов запроса - так что второй запрос не возникает. Конечно, это будет намного медленнее.

Или, есть ли другой способ?

ответ

0

ОК, так что в настоящее время я делаю это:

var iquery = GetPagedCriteria<T>(request, true) 
        .SetProjection(Projections.Property("Id")); 
    var ids = iquery.List<Guid>(); 
    var index = ids.IndexOf(new Guid(request.SelectedId)); 
    if (index >= 0) 
     request.Page = index/request.Rows + 1; 

и в параметрах настройки jqGrid

 url: "${Url.Href<MyController>(c => c.JsonIndex(null))}?_SelectedId=${Id}", 
     // remove _SelectedId from url once loaded because we only need to find its page once 
     gridComplete: function() { 
      $("#grid").setGridParam({url: "${Url.Href<MyController>(c => c.JsonIndex(null))}"}); 
     }, 
     loadComplete: function() { 
      $("#grid").setSelection("${Id}"); 
     } 

То есть в запросе я подстановок для индекса Ид и набора страницы, если найден (jqGrid даже понимает, чтобы отобразить соответствующий номер страницы в пейджере, потому что я возвращаю номер страницы для входа в json-данные). В настройке сетки я устанавливаю URL-адрес, чтобы сначала включить идентификатор поиска, но после загрузки сетки я удаляю его из URL-адреса, чтобы работать с кнопками prev/next. Однако я всегда стараюсь выделить выделенный идентификатор в сетке.

И, конечно, я всегда использую сортировку или метод не будет работать.

Одна проблема все еще существует в том, что я вытаскиваю все идентификаторы из db, что немного влияет на производительность.Если кто-то может определить, как найти индекс идентификатора в отфильтрованном/отсортированном запросе, я бы принял ответ (так как это реальная проблема); если нет, то я приму свой ответ ;-)

UPDATE: hm, если я сначала сортирую по идентификатору, я смогу использовать технику типа «SELECT COUNT (*) ... WHERE id < selectedid ». Это устранит проблему «pull ids» ... но, во всяком случае, я бы хотел сортировать по имени.

UPDATE: после реализации я нашел аккуратный побочный эффект этой техники ... при сортировке активный/выбранный элемент сохраняется ;-) Это работает, если _SelectedId сбрасывается только при изменении страницы, а не когда сетка загружена.

UPDATE: вот источники, которые включают в себя вышеуказанную технику: http://sprokhorenko.blogspot.com/2010/01/jqgrid-mvc-new-version-sources.html

0

Удостоверьтесь, что вам нужно будет выяснить страницу с другим запросом. Это, несомненно, потребует от вас указать столбец для заказа. Вам нужно будет заставить порядок и ограничение работать вместе, чтобы подсчитывать строки до этого конкретного идентификатора. После того, как у вас будет количество строк до вашего идентификатора, вы можете определить, какую страницу вам нужно выбрать и выполнить обычный запрос подкачки.

+0

Не знаю, как я могу получить количество заказов до ид? Если запрос отсортирован по id, что легко, но он обычно сортируется по имени или тому подобное ... В настоящее время я собираюсь получить только список идентификаторов с сервера (при сортировке и фильтрации) и сделать IndexOf (id) там , – queen3

+0

, если он отсортирован по имени, вам нужно найти имя для идентификатора и ограничить строки меньше или больше (в зависимости от направления сортировки), которые называют и подсчитывают эти строки. – dotjoe

+0

И если есть несколько одинаковых имен? Это дорога в ад ;-) – queen3

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