我需要从数据库中获取最大页面顺序:
int maxOrder = GetSession.Query<Page>().Max(x => x.PageOrder);
如果数据库表中有行,则上述工作正常,但当表为空时,我得到:
Value cannot be null.
Parameter name: item
答案 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);