2013-08-08 54 views
6

Having NHibernate kişiler toplamı.Linq:</p> <p><code>Company</code>, <code>Invoice</code> ve ondalık özelliği <code>Price</code> sahiptir <code>InvoiceLine</code>: toplamlar

Company, Invoice türünde bir koleksiyona sahiptir ve Invoice, InvoiceLine türünde bir koleksiyona sahiptir.

Belli bir şirketin faturalarına ait fatura satırlarına ait tüm fiyatların toplamını, kimliğin belirttiği belirli bir şirketten nasıl edinebilirim?

böyle sorguyu yazmaya çalıştı:

session 
    .Query<InvoiceLine>() 
    .Where(invoiceLine => invoiceLine.Invoice.Company.Id == companyId) 
    .Sum(invoiceLine => invoiceLine.Price); 

ama bir istisna atar:

NHibernate.Exceptions.GenericADOException 
"Could not execute query[SQL: SQL not available]" 

    at NHibernate.Impl.SessionImpl.List(IQueryExpression queryExpression, QueryParameters queryParameters, IList results) 
    at NHibernate.Impl.AbstractSessionImpl.List(IQueryExpression queryExpression, QueryParameters parameters) 
    at NHibernate.Impl.ExpressionQueryImpl.List() 
    at NHibernate.Linq.DefaultQueryProvider.ExecuteQuery(NhLinqExpression nhLinqExpression, IQuery query, NhLinqExpression nhQuery) 
    at NHibernate.Linq.DefaultQueryProvider.Execute(Expression expression) 
    at NHibernate.Linq.DefaultQueryProvider.Execute[TResult](Expression expression) 
    at System.Linq.Queryable.Sum[TSource](IQueryable`1 source, Expression`1 selector) 

iç istisna:

System.ArgumentNullException 
"Value cannot be null.\r\nParameter name: item" 

    at System.ThrowHelper.IfNullAndNullsAreIllegalThenThrow[T](Object value, ExceptionArgument argName) 
    at System.Collections.Generic.List`1.System.Collections.IList.Add(Object item) 
    at NHibernate.Util.ArrayHelper.<>c__DisplayClass2.<AddAll>b__0() 
    at NHibernate.Util.ArrayHelper.AddAll(IList to, IList from) 
    at NHibernate.Engine.Query.HQLQueryPlan.PerformList(QueryParameters queryParameters, ISessionImplementor session, IList results) 
    at NHibernate.Impl.SessionImpl.List(IQueryExpression queryExpression, QueryParameters queryParameters, IList results) 

Bu bir ilgisi olabilir boş koleksiyonları toplamak ama nasıl tamir edeceğimi bilmiyorum.

cevap

7

sonuç açıkça benim için problem tasarruf etmedi yanıt olarak işaretlenebilir bir decimal?

+0

Bu hemen hemen çözümdür, lütfen değiştirin. Sum (invoiceLine => (decimal?) InvoiceLine.Price) ?? 0 'yı kabul edip kabul edebilirim. –

0
session 
    .Query<InvoiceLine>() 
    .Where(invoiceLine => invoiceLine.Invoice.Company.Id == companyId && invoiceLine.Price != null) 
    .Sum(invoiceLine => (decimal)invoiceLine.Price); 
0

çözümdür

.Sum(invoiceLine => (decimal?)invoiceLine.Price) ?? 0; 

... decimal null için Price döküm deneyin. GenericAdoException yerine aşağıdaki yığınla bir InvalidOperationException aldım.

Burada önerilen çözüm Linq: select property collection benim için gerçek bir çözümdür.

Une erreur inattendue de type InvalidOperationException s'est produite sur le serveur 
System.InvalidOperationException: Code supposed to be unreachable 
    à System.Linq.Expressions.Compiler.StackSpiller.RewriteExpression(Expression node, Stack stack) 
    à System.Linq.Expressions.Compiler.StackSpiller.RewriteUnaryExpression(Expression expr, Stack stack) 
    à System.Linq.Expressions.Compiler.StackSpiller.RewriteExpression(Expression node, Stack stack) 
    à System.Linq.Expressions.Compiler.StackSpiller.RewriteExpressionFreeTemps(Expression expression, Stack stack) 
    à System.Linq.Expressions.Compiler.StackSpiller.Rewrite[T](Expression`1 lambda) 
    à System.Linq.Expressions.Expression`1.Accept(StackSpiller spiller) 
    à System.Linq.Expressions.Compiler.LambdaCompiler.Compile(LambdaExpression lambda, DebugInfoGenerator debugInfoGenerator) 
    à System.Linq.Expressions.Expression`1.Compile() 
    à NHibernate.Linq.ExpressionToHqlTranslationResults.MergeLambdasAndCompile[TDelegate](IList`1 itemTransformers) 
    à NHibernate.Linq.ExpressionToHqlTranslationResults..ctor(HqlTreeNode statement, IList`1 itemTransformers, IList`1 listTransformers, IList`1 postExecuteTransformers, List`1 additionalCriteria) 
    à NHibernate.Linq.IntermediateHqlTree.GetTranslation() 
    à NHibernate.Linq.Visitors.QueryModelVisitor.GenerateHqlQuery(QueryModel queryModel, VisitorParameters parameters, Boolean root) 
    à NHibernate.Linq.NhLinqExpression.Translate(ISessionFactoryImplementor sessionFactory, Boolean filter) 
    à NHibernate.Hql.Ast.ANTLR.ASTQueryTranslatorFactory.CreateQueryTranslators(IQueryExpression queryExpression, String collectionRole, Boolean shallow, IDictionary`2 filters, ISessionFactoryImplementor factory) 
    à NHibernate.Engine.Query.QueryExpressionPlan.CreateTranslators(IQueryExpression queryExpression, String collectionRole, Boolean shallow, IDictionary`2 enabledFilters, ISessionFactoryImplementor factory) 
    à NHibernate.Engine.Query.QueryExpressionPlan..ctor(IQueryExpression queryExpression, Boolean shallow, IDictionary`2 enabledFilters, ISessionFactoryImplementor factory) 
    à NHibernate.Engine.Query.QueryPlanCache.GetHQLQueryPlan(IQueryExpression queryExpression, Boolean shallow, IDictionary`2 enabledFilters) 
    à NHibernate.Impl.AbstractSessionImpl.GetHQLQueryPlan(IQueryExpression queryExpression, Boolean shallow) 
    à NHibernate.Impl.AbstractSessionImpl.CreateQuery(IQueryExpression queryExpression) 
    à NHibernate.Linq.DefaultQueryProvider.PrepareQuery(Expression expression, IQuery& query, NhLinqExpression& nhQuery) 
    à NHibernate.Linq.DefaultQueryProvider.Execute(Expression expression) 
    à NHibernate.Linq.DefaultQueryProvider.Execute[TResult](Expression expression) 
    à System.Linq.Queryable.Sum[TSource](IQueryable`1 source, Expression`1 selector) 
    à Secib.Server.Services.ReglementService.GetRegleTtc(FactureView facture) dans x:\Sources\Next\Alpha\SecibNext\Secib.Server\Services\ReglementService.cs:ligne 425 
    à Secib.Server.Services.ReglementService.DoesMontantSoldeFacture(FactureView facture, Decimal montantImpute) dans x:\Sources\Next\Alpha\SecibNext\Secib.Server\Services\ReglementService.cs:ligne 391 
    à Secib.Server.Services.ReglementService.DispatcheMontantImpute(Reglement reglement, ReglementFactureCompactDto factureDto) dans x:\Sources\Next\Alpha\SecibNext\Secib.Server\Services\ReglementService.cs:ligne 236 
    à Secib.Server.Services.ReglementService.SaveReglement(Reglement reglement, IList`1 factures) dans x:\Sources\Next\Alpha\SecibNext\Secib.Server\Services\ReglementService.cs:ligne 197 
    à Secib.Server.Controllers.ReglementController.<SaveReglement>z__OriginalMethod() dans x:\Sources\Next\Alpha\SecibNext\Secib.Server\Controllers\ReglementController.cs:ligne 141 
    à Secib.Server.Controllers.ReglementController.<SaveReglement>c__Binding.Invoke(Object& instance, Arguments arguments, Object aspectArgs) dans :ligne 0 
    à PostSharp.Aspects.Internals.MethodInterceptionArgsImpl`1.Proceed() 
    à Secib.Server.Aspects.TransactionAspect.OnInvoke(MethodInterceptionArgs args) dans x:\Sources\Next\Alpha\SecibNext\Secib.Server\Aspects\TransactionAspect.cs:ligne 32 
+0

Sorgunun/öğelerinizin nasıl göründüğü ve nasıl göründüğünüzün iç istisnası nedir? İşleyiş biçiminde bir şey değişmedikçe, kabul edilen cevabın işe yaradığından eminim. –

+0

'SelectMany' kodunun ikinci snr'si de 1 yerine DB'ye 2 istekte bulunur (geleceğe yazılabilir ancak daha az verimli olabilir). –

+0

InnerException boş. Sorgu çok basit ve sizinkine çok benzer: return Session.Query () \t \t \t \t .Where (x => x.Facture == Facture) \t \t \t \t .sum (x => (ondalık?) x.MontantRegle ?? 0); Facture, ReglementFacture (çoktan çoğa) tarafından referans alındığında ve MontantRegle ondalıktır (ve sütun null olamaz). NH v 4.0.0.4000 –

İlgili konular