2011-01-21 109 views
4

我需要从数据库中获取最大的页面顺序:如何在NHibernate中选择最大值?

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

上述工程是否有数据库中的表行,但是当表为空我越来越:

Value cannot be null. 
Parameter name: item 

回答

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

注投(我假设PageOrder是一个int)

13

在您正在执行的方式是正常的,因为枚举类型为GetSession.Query<Page>()返回的结果是空的(因为表格是空的,因为您提到过)。

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

如果表是空的,你会获得最大的= 0

+0

感谢ü了很多!有可能使用它的强类型版本? :) – Sasha 2011-01-21 13:00:23

+0

如果您使用NHibernate 3.0,则可以使用QueryOver。我编辑了我的答案,在QueryOver中添加了一个版本。 – tolism7 2011-01-21 13:45:32

5

如果您有由tolism7(InvalidCastException的)与QueryOver例题,这里就是我得到了它的工作:

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

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