C# - 在 LINQ sum 方法中计算值时应该无法访问代码
C# - Code supposed to be unreachable when calculate value in LINQ sum method
我想用来自 nHibernate IQueryable 的数据填充视图模型。但是我在 sum 方法中的计算有问题。
我已经尝试了几件事。起初有一个 Math.Round 在计算的两个小数位上。这很好用:
var documents = DocumentService.GetAll().WithSearchRequest(searchModel);
var document = from docs in documents
let taxAmount = docs.Positions.Sum(p => Math.Round(p.Amount * (p.TaxRate / 100M), 2))
let grossAmount = docs.Positions.Sum(p => p.Amount) + taxAmount
select new OverviewViewModel
{
Id = docs.Id,
TaxAmount = taxAmount,
GrossAmount = grossAmount,
};
当我删除这个 Math.Round 时,我得到一个 "Code supposed to be unreachable" 异常:
var 文档 = DocumentService.GetAll().WithSearchRequest(searchModel);
var document = from docs in documents
let taxAmount = docs.Positions.Sum(p => p.Amount * (p.TaxRate / 100M))
let grossAmount = docs.Positions.Sum(p => p.Amount) + taxAmount
select new OverviewViewModel
{
Id = docs.Id,
TaxAmount = taxAmount,
GrossAmount = grossAmount,
};
当我去掉 100 的除法时,效果很好。当我用另一个不是常量的十进制变量替换 100 时,它也能正常工作。所以问题似乎是常数除法。
所有值都是十进制的,我试图将它们转换为浮点数或双精度值,但没有解决问题。
InnerException 为空。这是堆栈跟踪:
bei System.Linq.Expressions.Compiler.StackSpiller.RewriteExpression(Expression node, Stack stack)
bei System.Linq.Expressions.Compiler.StackSpiller.RewriteUnaryExpression(Expression expr, Stack stack)
bei System.Linq.Expressions.Compiler.StackSpiller.RewriteExpression(Expression node, Stack stack)
bei System.Linq.Expressions.Compiler.StackSpiller.RewriteExpressionFreeTemps(Expression expression, Stack stack)
bei System.Linq.Expressions.Compiler.StackSpiller.Rewrite[T](Expression`1 lambda)
bei System.Linq.Expressions.Expression`1.Accept(StackSpiller spiller)
bei System.Linq.Expressions.Compiler.LambdaCompiler.Compile(LambdaExpression lambda, DebugInfoGenerator debugInfoGenerator)
bei System.Linq.Expressions.Expression`1.Compile()
bei NHibernate.Linq.ExpressionToHqlTranslationResults.MergeLambdasAndCompile[TDelegate](IList`1 itemTransformers)
bei NHibernate.Linq.ExpressionToHqlTranslationResults..ctor(HqlTreeNode statement, IList`1 itemTransformers, IList`1 listTransformers, IList`1 postExecuteTransformers, List`1 additionalCriteria)
bei NHibernate.Linq.IntermediateHqlTree.GetTranslation()
bei NHibernate.Linq.Visitors.QueryModelVisitor.GenerateHqlQuery(QueryModel queryModel, VisitorParameters parameters, Boolean root)
bei NHibernate.Linq.Visitors.HqlGeneratorExpressionTreeVisitor.VisitSubQueryExpression(SubQueryExpression expression)
bei NHibernate.Linq.Visitors.HqlGeneratorExpressionTreeVisitor.VisitExpression(Expression expression)
bei NHibernate.Linq.Visitors.HqlGeneratorExpressionTreeVisitor.VisitUnaryExpression(UnaryExpression expression)
bei NHibernate.Linq.Visitors.HqlGeneratorExpressionTreeVisitor.VisitExpression(Expression expression)
bei NHibernate.Linq.Visitors.SelectClauseVisitor.VisitExpression(Expression expression)
bei Remotion.Linq.Parsing.ExpressionTreeVisitor.VisitMemberAssignment(MemberAssignment memberAssigment)
bei Remotion.Linq.Parsing.ExpressionTreeVisitor.VisitMemberBinding(MemberBinding memberBinding)
bei Remotion.Linq.Parsing.ExpressionTreeVisitor.VisitList[T](ReadOnlyCollection`1 list, Func`2 visitMethod)
bei Remotion.Linq.Parsing.ExpressionTreeVisitor.VisitMemberBindingList(ReadOnlyCollection`1 expressions)
bei Remotion.Linq.Parsing.ExpressionTreeVisitor.VisitMemberInitExpression(MemberInitExpression expression)
bei Remotion.Linq.Parsing.ExpressionTreeVisitor.VisitExpression(Expression expression)
bei NHibernate.Linq.Visitors.SelectClauseVisitor.VisitExpression(Expression expression)
bei NHibernate.Linq.Visitors.SelectClauseVisitor.Visit(Expression expression)
bei NHibernate.Linq.Visitors.QueryModelVisitor.VisitSelectClause(SelectClause selectClause, QueryModel queryModel)
bei Remotion.Linq.Clauses.SelectClause.Accept(IQueryModelVisitor visitor, QueryModel queryModel)
bei Remotion.Linq.QueryModelVisitorBase.VisitQueryModel(QueryModel queryModel)
bei NHibernate.Linq.Visitors.QueryModelVisitor.GenerateHqlQuery(QueryModel queryModel, VisitorParameters parameters, Boolean root)
bei NHibernate.Linq.NhLinqExpression.Translate(ISessionFactoryImplementor sessionFactory, Boolean filter)
bei NHibernate.Hql.Ast.ANTLR.ASTQueryTranslatorFactory.CreateQueryTranslators(IQueryExpression queryExpression, String collectionRole, Boolean shallow, IDictionary`2 filters, ISessionFactoryImplementor factory)
bei NHibernate.Engine.Query.QueryPlanCache.GetHQLQueryPlan(IQueryExpression queryExpression, Boolean shallow, IDictionary`2 enabledFilters)
bei NHibernate.Impl.AbstractSessionImpl.GetHQLQueryPlan(IQueryExpression queryExpression, Boolean shallow)
bei NHibernate.Impl.AbstractSessionImpl.CreateQuery(IQueryExpression queryExpression)
bei NHibernate.Linq.DefaultQueryProvider.PrepareQuery(Expression expression, IQuery& query, NhLinqExpression& nhQuery)
bei NHibernate.Linq.DefaultQueryProvider.Execute(Expression expression)
bei NHibernate.Linq.DefaultQueryProvider.Execute[TResult](Expression expression)
bei Remotion.Linq.QueryableBase`1.System.Collections.IEnumerable.GetEnumerator()
bei Kendo.Mvc.Extensions.QueryableExtensions.Execute[TModel,TResult](IQueryable source, Func`2 selector)
bei Kendo.Mvc.Extensions.QueryableExtensions.CreateDataSourceResult[TModel,TResult](IQueryable queryable, DataSourceRequest request, ModelStateDictionary modelState, Func`2 selector)
bei Kendo.Mvc.Extensions.QueryableExtensions.ToDataSourceResult(IQueryable enumerable, DataSourceRequest request)
bei Web.Modules.Controllers.DocumentController.ReadDocuments(DataSourceRequest request, DocumentSearchViewModel searchModel) in C:\Modules\Invoicing\Controllers\DocumentController.cs:Zeile 624.
bei lambda_method(Closure , ControllerBase , Object[] )
bei System.Web.Mvc.ActionMethodDispatcher.Execute(ControllerBase controller, Object[] parameters)
bei System.Web.Mvc.ReflectedActionDescriptor.Execute(ControllerContext controllerContext, IDictionary`2 parameters)
bei System.Web.Mvc.ControllerActionInvoker.InvokeActionMethod(ControllerContext controllerContext, ActionDescriptor actionDescriptor, IDictionary`2 parameters)
bei System.Web.Mvc.Async.AsyncControllerActionInvoker.<BeginInvokeSynchronousActionMethod>b__39(IAsyncResult asyncResult, ActionInvocation innerInvokeState)
bei System.Web.Mvc.Async.AsyncResultWrapper.WrappedAsyncResult`2.CallEndDelegate(IAsyncResult asyncResult)
bei System.Web.Mvc.Async.AsyncResultWrapper.WrappedAsyncResultBase`1.End()
bei System.Web.Mvc.Async.AsyncControllerActionInvoker.EndInvokeActionMethod(IAsyncResult asyncResult)
bei System.Web.Mvc.Async.AsyncControllerActionInvoker.AsyncInvocationWithFilters.<InvokeActionMethodFilterAsynchronouslyRecursive>b__3d()
bei System.Web.Mvc.Async.AsyncControllerActionInvoker.AsyncInvocationWithFilters.<>c__DisplayClass46.<InvokeActionMethodFilterAsynchronouslyRecursive>b__3f()
LINQ 求和有什么问题?
问题是我们的旧 nHibernate 版本。使用 5.1.3 版本即可。
我想用来自 nHibernate IQueryable 的数据填充视图模型。但是我在 sum 方法中的计算有问题。 我已经尝试了几件事。起初有一个 Math.Round 在计算的两个小数位上。这很好用:
var documents = DocumentService.GetAll().WithSearchRequest(searchModel);
var document = from docs in documents
let taxAmount = docs.Positions.Sum(p => Math.Round(p.Amount * (p.TaxRate / 100M), 2))
let grossAmount = docs.Positions.Sum(p => p.Amount) + taxAmount
select new OverviewViewModel
{
Id = docs.Id,
TaxAmount = taxAmount,
GrossAmount = grossAmount,
};
当我删除这个 Math.Round 时,我得到一个 "Code supposed to be unreachable" 异常: var 文档 = DocumentService.GetAll().WithSearchRequest(searchModel);
var document = from docs in documents
let taxAmount = docs.Positions.Sum(p => p.Amount * (p.TaxRate / 100M))
let grossAmount = docs.Positions.Sum(p => p.Amount) + taxAmount
select new OverviewViewModel
{
Id = docs.Id,
TaxAmount = taxAmount,
GrossAmount = grossAmount,
};
当我去掉 100 的除法时,效果很好。当我用另一个不是常量的十进制变量替换 100 时,它也能正常工作。所以问题似乎是常数除法。 所有值都是十进制的,我试图将它们转换为浮点数或双精度值,但没有解决问题。
InnerException 为空。这是堆栈跟踪:
bei System.Linq.Expressions.Compiler.StackSpiller.RewriteExpression(Expression node, Stack stack)
bei System.Linq.Expressions.Compiler.StackSpiller.RewriteUnaryExpression(Expression expr, Stack stack)
bei System.Linq.Expressions.Compiler.StackSpiller.RewriteExpression(Expression node, Stack stack)
bei System.Linq.Expressions.Compiler.StackSpiller.RewriteExpressionFreeTemps(Expression expression, Stack stack)
bei System.Linq.Expressions.Compiler.StackSpiller.Rewrite[T](Expression`1 lambda)
bei System.Linq.Expressions.Expression`1.Accept(StackSpiller spiller)
bei System.Linq.Expressions.Compiler.LambdaCompiler.Compile(LambdaExpression lambda, DebugInfoGenerator debugInfoGenerator)
bei System.Linq.Expressions.Expression`1.Compile()
bei NHibernate.Linq.ExpressionToHqlTranslationResults.MergeLambdasAndCompile[TDelegate](IList`1 itemTransformers)
bei NHibernate.Linq.ExpressionToHqlTranslationResults..ctor(HqlTreeNode statement, IList`1 itemTransformers, IList`1 listTransformers, IList`1 postExecuteTransformers, List`1 additionalCriteria)
bei NHibernate.Linq.IntermediateHqlTree.GetTranslation()
bei NHibernate.Linq.Visitors.QueryModelVisitor.GenerateHqlQuery(QueryModel queryModel, VisitorParameters parameters, Boolean root)
bei NHibernate.Linq.Visitors.HqlGeneratorExpressionTreeVisitor.VisitSubQueryExpression(SubQueryExpression expression)
bei NHibernate.Linq.Visitors.HqlGeneratorExpressionTreeVisitor.VisitExpression(Expression expression)
bei NHibernate.Linq.Visitors.HqlGeneratorExpressionTreeVisitor.VisitUnaryExpression(UnaryExpression expression)
bei NHibernate.Linq.Visitors.HqlGeneratorExpressionTreeVisitor.VisitExpression(Expression expression)
bei NHibernate.Linq.Visitors.SelectClauseVisitor.VisitExpression(Expression expression)
bei Remotion.Linq.Parsing.ExpressionTreeVisitor.VisitMemberAssignment(MemberAssignment memberAssigment)
bei Remotion.Linq.Parsing.ExpressionTreeVisitor.VisitMemberBinding(MemberBinding memberBinding)
bei Remotion.Linq.Parsing.ExpressionTreeVisitor.VisitList[T](ReadOnlyCollection`1 list, Func`2 visitMethod)
bei Remotion.Linq.Parsing.ExpressionTreeVisitor.VisitMemberBindingList(ReadOnlyCollection`1 expressions)
bei Remotion.Linq.Parsing.ExpressionTreeVisitor.VisitMemberInitExpression(MemberInitExpression expression)
bei Remotion.Linq.Parsing.ExpressionTreeVisitor.VisitExpression(Expression expression)
bei NHibernate.Linq.Visitors.SelectClauseVisitor.VisitExpression(Expression expression)
bei NHibernate.Linq.Visitors.SelectClauseVisitor.Visit(Expression expression)
bei NHibernate.Linq.Visitors.QueryModelVisitor.VisitSelectClause(SelectClause selectClause, QueryModel queryModel)
bei Remotion.Linq.Clauses.SelectClause.Accept(IQueryModelVisitor visitor, QueryModel queryModel)
bei Remotion.Linq.QueryModelVisitorBase.VisitQueryModel(QueryModel queryModel)
bei NHibernate.Linq.Visitors.QueryModelVisitor.GenerateHqlQuery(QueryModel queryModel, VisitorParameters parameters, Boolean root)
bei NHibernate.Linq.NhLinqExpression.Translate(ISessionFactoryImplementor sessionFactory, Boolean filter)
bei NHibernate.Hql.Ast.ANTLR.ASTQueryTranslatorFactory.CreateQueryTranslators(IQueryExpression queryExpression, String collectionRole, Boolean shallow, IDictionary`2 filters, ISessionFactoryImplementor factory)
bei NHibernate.Engine.Query.QueryPlanCache.GetHQLQueryPlan(IQueryExpression queryExpression, Boolean shallow, IDictionary`2 enabledFilters)
bei NHibernate.Impl.AbstractSessionImpl.GetHQLQueryPlan(IQueryExpression queryExpression, Boolean shallow)
bei NHibernate.Impl.AbstractSessionImpl.CreateQuery(IQueryExpression queryExpression)
bei NHibernate.Linq.DefaultQueryProvider.PrepareQuery(Expression expression, IQuery& query, NhLinqExpression& nhQuery)
bei NHibernate.Linq.DefaultQueryProvider.Execute(Expression expression)
bei NHibernate.Linq.DefaultQueryProvider.Execute[TResult](Expression expression)
bei Remotion.Linq.QueryableBase`1.System.Collections.IEnumerable.GetEnumerator()
bei Kendo.Mvc.Extensions.QueryableExtensions.Execute[TModel,TResult](IQueryable source, Func`2 selector)
bei Kendo.Mvc.Extensions.QueryableExtensions.CreateDataSourceResult[TModel,TResult](IQueryable queryable, DataSourceRequest request, ModelStateDictionary modelState, Func`2 selector)
bei Kendo.Mvc.Extensions.QueryableExtensions.ToDataSourceResult(IQueryable enumerable, DataSourceRequest request)
bei Web.Modules.Controllers.DocumentController.ReadDocuments(DataSourceRequest request, DocumentSearchViewModel searchModel) in C:\Modules\Invoicing\Controllers\DocumentController.cs:Zeile 624.
bei lambda_method(Closure , ControllerBase , Object[] )
bei System.Web.Mvc.ActionMethodDispatcher.Execute(ControllerBase controller, Object[] parameters)
bei System.Web.Mvc.ReflectedActionDescriptor.Execute(ControllerContext controllerContext, IDictionary`2 parameters)
bei System.Web.Mvc.ControllerActionInvoker.InvokeActionMethod(ControllerContext controllerContext, ActionDescriptor actionDescriptor, IDictionary`2 parameters)
bei System.Web.Mvc.Async.AsyncControllerActionInvoker.<BeginInvokeSynchronousActionMethod>b__39(IAsyncResult asyncResult, ActionInvocation innerInvokeState)
bei System.Web.Mvc.Async.AsyncResultWrapper.WrappedAsyncResult`2.CallEndDelegate(IAsyncResult asyncResult)
bei System.Web.Mvc.Async.AsyncResultWrapper.WrappedAsyncResultBase`1.End()
bei System.Web.Mvc.Async.AsyncControllerActionInvoker.EndInvokeActionMethod(IAsyncResult asyncResult)
bei System.Web.Mvc.Async.AsyncControllerActionInvoker.AsyncInvocationWithFilters.<InvokeActionMethodFilterAsynchronouslyRecursive>b__3d()
bei System.Web.Mvc.Async.AsyncControllerActionInvoker.AsyncInvocationWithFilters.<>c__DisplayClass46.<InvokeActionMethodFilterAsynchronouslyRecursive>b__3f()
LINQ 求和有什么问题?
问题是我们的旧 nHibernate 版本。使用 5.1.3 版本即可。