如何在NHibernate中选择最大值?

Sas*_*sha 4 nhibernate fluent max fluent-nhibernate

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

int maxOrder = GetSession.Query<Page>().Max(x => x.PageOrder);
Run Code Online (Sandbox Code Playgroud)

上面的工作如果数据库表中有行,但当表为空时我得到:

Value cannot be null.
Parameter name: item
Run Code Online (Sandbox Code Playgroud)

tol*_*sm7 14

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

您应该得到的例外是:Sequence不包含任何元素.你在你的问题提的例外是因为该项目的变量(这是不相关的其它NHiberanate查询你上面所列内容)为空(第54行指定的项目属性设置为null).

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

var max = GetSession.CreateCriteria<Page>()
                .SetProjection(Projections.Max("PageOrder"))
                .UniqueResult();
Run Code Online (Sandbox Code Playgroud)

或者使用带有NHibenrate 3.0的QueryOver:

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

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


Die*_*hon 8

Session.Query<Page>().Max(x => (int?)x.PageOrder)
Run Code Online (Sandbox Code Playgroud)

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


bre*_*eez 7

如果您通过tolism7(InvalidCastException)遇到QueryOver示例问题,那么我的工作方式如下:

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

return max == null ? 0 : Convert.ToInt32(max);
Run Code Online (Sandbox Code Playgroud)