如何在NHibernate中选择最大值?

时间:2011-01-21 11:46:31

标签: nhibernate fluent-nhibernate max fluent

我需要从数据库中获取最大页面顺序:

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

如果数据库表中有行,则上述工作正常,但当表为空时,我得到:

Value cannot be null.
Parameter name: item

3 个答案:

答案 0 :(得分:14)

在你正在做的方式中,获取异常是正常的,因为GetSession.Query<Page>()返回的可枚举是空的(因为你提到的表是空的)。

您应该得到的例外是:Sequence不包含任何元素。 你在问题中提到的例外是因为item变量(与你上面列出的NHiberanate查询无关)是null(第54行将item属性赋给null)。

从表中的属性获取最大值的更安全的方法如下:

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

或使用带有NHibenrate 3.0的QueryOver:

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

如果表格为空,您将获得max = 0

答案 1 :(得分:8)

Session.Query<Page>().Max(x => (int?)x.PageOrder)

注意演员表(我假设PageOrder是一个int)

答案 2 :(得分:6)

如果您通过tolism7(InvalidCastException)遇到QueryOver示例问题,请按照以下方式进行操作:

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

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