2012-04-19 3 views
0

у меня есть этот NHibernate Critera, который прекрасно работаетNHibernate Expression.In бросать исключение

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 

ответ

2

ошибка т.е. бросают потому что вы не получаете уникальный результат из базы данных. Можете ли вы отслеживать сгенерированный sql с помощью профилировщика SQL или NHProf, а затем запускать его против 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]; 
+0

Yup Я получил, где у меня есть исключение, это дало мне представление о том, откуда моя ошибка, UniqueResult дает мне вопрос, когда я возвращаю нулевые данные. +1 – Raymund

Смежные вопросы