несколько результатов в одном вызове - PullRequest
2 голосов
/ 22 декабря 2009

При подкачке данных я хочу не только вернуть 10 результатов, но и получить общее количество элементов на всех страницах.

Как я могу получить общее количество и результаты для страницы за один звонок?

Мой постраничный метод:

публичный IList GetByCategoryId (int categoryId, int firstResult, int maxResults) {

        IList<Article> articles = Session.CreateQuery(
            "select a from Article as a join a.Categories c where c.ID = :ID")
            .SetInt32("ID", categoryId)
            .SetFirstResult(firstResult)
            .SetMaxResults(maxResults)
            .List<Article>();



        return articles;
    }

Ответы [ 3 ]

2 голосов
/ 22 декабря 2009

Правда в том, что вы делаете два звонка. Но вызов count (*) очень и очень дешев в большинстве баз данных, и когда вы делаете это после основного вызова, иногда помогает кеш запросов.

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

1 голос
/ 24 декабря 2009

Обратите внимание, что последние версии NHibernate поддерживают идею будущего, поэтому вы можете это сделать.

var items = s.CreateQuery("from Item i where i.Id > :id")
       .SetInt32("id", 50)
       .Future<Item>(); 

var count = s.CreateQuery("select count(*) from Item i where i.Id > :id")
       .SetInt32("id", 50)
       .FutureValue<long>(); 

Это гораздо более естественный синтаксис, и он все равно приведет к одному запросу БД. Вы можете прочитать больше об этом здесь: http://ayende.com/Blog/archive/2009/04/27/nhibernate-futures.aspx

1 голос
/ 23 декабря 2009

Я верю, что вы действительно можете делать то, что просите. Вы можете восстановить счет и страницу за один раз в коде, но не в одном операторе SQL. На самом деле два запроса отправляются в базу данных, но в одном цикле, и результаты извлекаются в виде массива из 2 элементов. Одним из элементов является общее число в виде целого числа, а вторым - IList ваших найденных объектов.

Есть 2 способа сделать это:

  • MultyQuery
  • Многокритериальные

Вот пример, взятый по ссылкам ниже:

IList results = s.CreateMultiQuery()
       .Add("from Item i where i.Id > :id")
       .Add("select count(*) from Item i where i.Id > :id")
       .SetInt32("id", 50)
       .List(); 

IList items = (IList)results[0];
long count = (long)((IList)results[1])[0];

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

http://ayende.com/Blog/archive/2006/12/05/NHibernateMutliQuerySupport.aspx http://ayende.com/Blog/archive/2007/05/20/NHibernate-Multi-Criteria.aspx

Если вы прочтете 2 статьи выше, вы увидите, что использование этого подхода дает выигрыш в производительности, который добавляет ценность в любом случае более прозрачному и ясному подходу к подкачке страниц с помощью MultiQuery и MultiCriteria по сравнению с обычным способом.

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