Как выбрать максимальное значение в NHibernate? - PullRequest
4 голосов
/ 21 января 2011

Мне нужно получить максимальный порядок страниц из базы данных:

int maxOrder = GetSession.Query<Page>().Max(x => x.PageOrder);

Выше работает, если в таблице базы данных есть строки, но когда таблица пуста, я получаю:

Value cannot be null.
Parameter name: item

Ответы [ 3 ]

14 голосов
/ 21 января 2011

То, как вы это делаете, - это нормально получить исключение, поскольку перечислимое значение, возвращаемое GetSession.Query<Page>(), пусто (поскольку таблица пуста, как вы упомянули).

Исключение, которое выдолжно быть: последовательность не содержит элементов.Исключением, которое вы упоминаете в своем вопросе, является то, что переменная item (которая не имеет отношения к запросу NHiberanate, который вы перечислили выше) имеет значение null (строка 54 присваивает свойству item значение null).

Более безопасный способ получить максимумиз свойства в таблице будет следующее:

var max = GetSession.CreateCriteria<Page>()
                .SetProjection(Projections.Max("PageOrder"))
                .UniqueResult();

или использование QueryOver с NHibenrate 3.0:

var max = GetSession.QueryOver<Page>()
      .Select(
            Projections
               .ProjectionList()
               .Add(Projections.Max<Page>(x => x.PageOrder)))
      .List<int>().First();

Если таблица пуста, вы получите max = 0

8 голосов
/ 21 января 2011
Session.Query<Page>().Max(x => (int?)x.PageOrder)

Обратите внимание на приведение (я предполагаю, что PageOrder - int)

6 голосов
/ 15 июня 2015

Если у вас возникли проблемы с примером QueryOver от tolism7 (InvalidCastException), вот как я его получил:

var max = session.QueryOver<Page>()
    .Select(Projections.Max<Page>(x => x.PageOrder))
    .SingleOrDefault<object>();

return max == null ? 0 : Convert.ToInt32(max);
...