2011-01-28 2 views
0

Я пытался заполнить страницу поиска для местоположений в моей системе. Это мой первый раз, пытаясь настроить пейджинг в моей сетке.Метод SetFirstResult (0) NHibernate возвращает 0 строк, когда SetMaxResults также задано

Я использую Fluent Nhibernate и извлекаю данные из базы данных SQL 2008.

Когда я использую criteria.SetFirstResult(0).SetMaxResults(10);, я не получаю данные назад. Я профилирую базу данных, и это не похоже на то, что SQL выполняет поиск, когда-либо происходящий. Когда я меняю оператор на criteria.SetFirstResult(1).SetMaxResults(10);, я вижу строки 2-11 в моей сетке, и я могу видеть sql, который был сгенерирован через профилировщик. Кто-нибудь знает, почему criteria.SetFirstResult(0) не работает, когда SetMaxResults настроено на любое значение?

Я прилагаю свободно NHibernate код ниже:

public LocationSearchResults Search(string text, int pageNumber, int pageSize, string orderBy, string orderByDirection) 
    { 
     var criteria = Session.CreateCriteria(typeof(Location)); 
     var dis = Restrictions.Disjunction(); 
     dis.Add(Restrictions.Like("LocationName", text, MatchMode.Anywhere)); 
     dis.Add(Restrictions.Like("LocationAddress", text, MatchMode.Anywhere)); 
     dis.Add(Restrictions.Like("LocationCity", text, MatchMode.Anywhere)); 
     dis.Add(Restrictions.Like("LocationState", text, MatchMode.Anywhere)); 
     dis.Add(Restrictions.Like("LocationZip", text, MatchMode.Anywhere)); 
     criteria.Add(dis); 

     LocationSearchResults results = new LocationSearchResults(); 
     results.NumberOfResults = criteria.List<Location>().Count; 

     if (orderByDirection == "asc") 
     { 
      criteria.AddOrder(Order.Asc(orderBy)); 
     } 
     else 
     { 
      criteria.AddOrder(Order.Desc(orderBy)); 
     } 

     //criteria.SetFirstResult((pageNumber - 1) * pageSize).SetMaxResults(pageSize); 
     criteria.SetFirstResult(0); 
     criteria.SetMaxResults(10); 

     results.SearchResults = (List<Location>)criteria.List<Location>(); 

     return results; 
    } 
    #endregion 
+2

Важно знать, к какой базе данных вы ориентируетесь. Свободный не здесь. –

+0

Я использую базу данных SQL Server 2008. –

+0

Насколько я знаю, критерий.SetFirstResult (0) имеет тот же эффект, что и его удаление. Кажется, вы выполняете запрос дважды. Однажды, чтобы получить счет и еще раз, чтобы ограничить результаты на основе пейджинга. Вы побеждаете цель пейджинга, делая это. – Vadim

ответ

0

После возвращения и смотрит на этот вопрос, я понял, что произошло. Я заметил, что NHibernate на самом деле бросает ошибку. Сообщение было «Запрос должен начинаться с« SELECT »или« SELECT DISTINCT ». Первый ответ в NHibernate 2nd lvl cache, custom query, sqldialect решил мою проблему. Мне пришлось установить use_sql_comments в false в моем файле конфигурации.

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