jqGrid / NHibernate / SQL: перейти к выбранной записи - PullRequest
0 голосов
/ 15 декабря 2009

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

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

Проблема в том, что этот сотрудник может быть на текущей странице. Например. Я отображаю 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 может оптимизировать запрос, потому что порядок не определен ... в этом случае я получу предсказуемый результат только в том случае, если я потяну ALL данные запроса один раз , а затем программно в C # будет разрезать указанную часть результатов запроса, чтобы второй запрос не выполнялся. Но это будет намного медленнее, конечно.

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

Ответы [ 2 ]

0 голосов
/ 16 декабря 2009

ОК, сейчас я делаю это:

    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}");
       }

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

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

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

ОБНОВЛЕНИЕ: хм, если я сначала отсортирую по идентификатору, я смогу использовать технику, например "SELECT COUNT (*) ... WHERE id

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

ОБНОВЛЕНИЕ: вот источники, которые включают вышеупомянутую технику: http://sprokhorenko.blogspot.com/2010/01/jqgrid-mvc-new-version-sources.html

0 голосов
/ 15 декабря 2009

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...