我有这个nHibernate Critera可以正常工作
var amount = (decimal)Session.CreateCriteria<Transaction>()
.Add(Expression.Eq("Account.Id", accountId))
.SetProjection(Projections.ProjectionList()
.Add(Projections.GroupProperty("Account.Id"))
.Add(Projections.Sum("InvoiceGross"), "total"))
.SetMaxResults(1)
.SetResultTransformer(Transformers.AliasToEntityMap)
.UniqueResult<IDictionary>()["total"];
但是当我开始像这样添加Expression.In
时
var amount = (decimal)Session.CreateCriteria<Transaction>()
.Add(Expression.Eq("Account.Id", accountId))
.Add(Expression.In("StatusType.Id", statusTypes))
.SetProjection(Projections.ProjectionList()
.Add(Projections.GroupProperty("Account.Id"))
.Add(Projections.Sum("InvoiceGross"), "total"))
.SetMaxResults(1)
.SetResultTransformer(Transformers.AliasToEntityMap)
.UniqueResult<IDictionary>()["total"];
任何想法为什么会发生这种情况,顺便提一下 statusTypes
int[]
类型
它开始抛出异常"Object reference not set to an instance of an object."
这是我想要实现的SQL查询
SELECT SUM(InvoiceGross) AS total
FROM Transactions
WHERE (AccountID = @accountId) (statusTypeID IN (1,2,3,4))
GROUP BY AccountID
答案 0 :(得分:2)
错误即被抛出是因为您没有从数据库中获得唯一的结果。是否可以使用SQL事件探查器或NHProf监视生成的sql,然后针对db运行该命令以查看查询是否确实返回数据。
在开始使用ResultTransformer之前,只需将其转换为一个简单的List,看看你是否得到一个数组列表,其中Account.Id作为数组的第一项,而sum是第二项,即尝试
var amount = (decimal)Session.CreateCriteria<Transaction>()
.Add(Expression.Eq("Account.Id", accountId))
.Add(Expression.In("StatusType.Id", statusTypes))
.SetProjection(Projections.ProjectionList()
.Add(Projections.GroupProperty("Account.Id"))
.Add(Projections.Sum("InvoiceGross"), "total"))
.SetMaxResults(1)
.List();
var sum=amount[0][1];