【问题标题】:How can I select the maximum value in NHibernate?如何在 NHibernate 中选择最大值?
【发布时间】:2011-06-13 02:31:13
【问题描述】:

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

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

如果数据库表中有行,上述方法有效,但是当表为空时,我得到:

Value cannot be null.
Parameter name: item

【问题讨论】:

    标签: nhibernate fluent-nhibernate max fluent


    【解决方案1】:

    在您这样做的方式中,作为可枚举的异常,GetSession.Query&lt;Page&gt;() 返回是空的(因为您提到的表是空的),这是正常的。

    您应该得到的例外是:序列不包含任何元素。 您在问题中提到的例外是因为 item 变量(与您上面列出的 NHiberate 查询无关)为 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

    【讨论】:

    • 非常感谢!是否可以使用它的强类型版本? :)
    • 如果您使用的是 NHibernate 3.0,您可以使用 QueryOver。我已经编辑了我的答案以包含一个带有 QueryOver 的版本。
    • @tolism7 QueryOver 版本不适用于我的空表。我本来期望您描述的行为,但是对 List 的调用会引发异常...但是,迭戈的答案对我来说很好,而且更短:)
    • @MartinKlinke 好吧,自从我给出这个答案已经 3 年多了,从那时起 NHibernate 中可能发生了一些变化。在我测试的版本中,它运行良好,但我很高兴你在这里找到了答案,即使它不是我的 ;-)
    • 发生异常是因为如果没有 DB 记录,则查询结果的类型是 int?,而不是 int。如果您修改代码以考虑到这一点,则可以使其工作,您只需要进行一堆不太好的空值检查。
    【解决方案2】:
    Session.Query<Page>().Max(x => (int?)x.PageOrder)
    

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

    【讨论】:

    • 如果 db 中没有 Page 记录,这将在 NHibernate v3.3.1.* 中引发 ArgumentOutOfRange 异常
    【解决方案3】:

    如果您在使用 tolism7 (InvalidCastException) 的 QueryOver 示例时遇到问题,以下是我的工作方式:

    var max = session.QueryOver<Page>()
        .Select(Projections.Max<Page>(x => x.PageOrder))
        .SingleOrDefault<object>();
    
    return max == null ? 0 : Convert.ToInt32(max);
    

    【讨论】:

      猜你喜欢
      • 2021-05-03
      • 1970-01-01
      • 1970-01-01
      • 2013-04-03
      • 1970-01-01
      • 1970-01-01
      • 2012-08-17
      • 1970-01-01
      • 2021-03-26
      相关资源
      最近更新 更多