0

我有这个工作正常的 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 Query

SELECT SUM(InvoiceGross) AS total
FROM  Transactions
WHERE (AccountID = @accountId) (statusTypeID IN (1,2,3,4))
GROUP BY AccountID
4

1 回答 1

2

错误即被抛出,因为您没有从数据库中获得唯一的结果。您能否使用 SQL 探查器或 NHProf 监视生成的 sql,然后针对 db 运行它以查看查询是否确实在返回数据。

同样,在您开始使用 ResultTransformer 之前,只需将其转换为一个简单的列表,看看您是否获得了一个数组列表,其中 Account.Id 作为数组的第一项,总和是第二项,即尝试

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];
于 2012-04-20T01:49:17.300 回答