multiple results in a single call

Refresh

December 2018

Views

340 time

2

When paging data, I want to not only return 10 results, but I also want to get the total number of items in all the pages.

How can I get the total count AND the results for the page in a single call?

My paged method is:

public 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 answers

2

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

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

1

Я считаю, что вы на самом деле можете делать то, что вы спрашиваете. Вы можете retieve количества и страниц в один раз в коде, но не в одном 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 и многокритериальным против традиционного способа.

1

Обратите внимание, что последние версии 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>(); 

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