简体   繁体   English

linq到nhibernate查询的计数中的空引用异常

[英]null reference exception in Count of linq to nhibernate query

I have a linq query by NHibernate. 我有一个NHibernate的linq查询。

var q = SessionInstance.Query<Identity>()
       .Count(x => MyPerson != null && x.Person.Id == MyPerson.Id);

But Check condition in Count Is not Valid. 但是“ Count ”中的“检查条件”无效。 Because if value of MyPerson be null ,expected result of count is 0 but this query has a NullReferenceException By this message : 因为如果MyPerson值为null,则count的预期结果为0但是此查询具有NullReferenceException通过此消息:

Object reference not set to an instance of an object.

Why? 为什么?

Stack trace is : 堆栈跟踪为:

   at lambda_method(Closure )
   at Remotion.Data.Linq.Parsing.ExpressionTreeVisitors.PartialEvaluatingExpressionTreeVisitor.EvaluateSubtree(Expression subtree)
   at Remotion.Data.Linq.Parsing.ExpressionTreeVisitors.PartialEvaluatingExpressionTreeVisitor.VisitExpression(Expression expression)
   at Remotion.Data.Linq.Parsing.ExpressionTreeVisitor.VisitBinaryExpression(BinaryExpression expression)
   at Remotion.Data.Linq.Parsing.ExpressionTreeVisitor.VisitExpression(Expression expression)
   at Remotion.Data.Linq.Parsing.ExpressionTreeVisitors.PartialEvaluatingExpressionTreeVisitor.VisitExpression(Expression expression)
   at Remotion.Data.Linq.Parsing.ExpressionTreeVisitor.VisitBinaryExpression(BinaryExpression expression)
   at Remotion.Data.Linq.Parsing.ExpressionTreeVisitor.VisitExpression(Expression expression)
   at Remotion.Data.Linq.Parsing.ExpressionTreeVisitors.PartialEvaluatingExpressionTreeVisitor.VisitExpression(Expression expression)
   at Remotion.Data.Linq.Parsing.ExpressionTreeVisitor.VisitLambdaExpression(LambdaExpression expression)
   at Remotion.Data.Linq.Parsing.ExpressionTreeVisitor.VisitExpression(Expression expression)
   at Remotion.Data.Linq.Parsing.ExpressionTreeVisitors.PartialEvaluatingExpressionTreeVisitor.VisitExpression(Expression expression)
   at Remotion.Data.Linq.Parsing.ExpressionTreeVisitor.VisitUnaryExpression(UnaryExpression expression)
   at Remotion.Data.Linq.Parsing.ExpressionTreeVisitor.VisitExpression(Expression expression)
   at Remotion.Data.Linq.Parsing.ExpressionTreeVisitors.PartialEvaluatingExpressionTreeVisitor.VisitExpression(Expression expression)
   at Remotion.Data.Linq.Parsing.ExpressionTreeVisitor.VisitAndConvert[T](T expression, String methodName)
   at Remotion.Data.Linq.Parsing.ExpressionTreeVisitor.<>c__DisplayClass6`1.<VisitAndConvert>b__5(T expression)
   at Remotion.Data.Linq.Parsing.ExpressionTreeVisitor.VisitList[T](ReadOnlyCollection`1 list, Func`2 visitMethod)
   at Remotion.Data.Linq.Parsing.ExpressionTreeVisitor.VisitAndConvert[T](ReadOnlyCollection`1 expressions, String callerName)
   at Remotion.Data.Linq.Parsing.ExpressionTreeVisitor.VisitMethodCallExpression(MethodCallExpression expression)
   at Remotion.Data.Linq.Parsing.ExpressionTreeVisitor.VisitExpression(Expression expression)
   at Remotion.Data.Linq.Parsing.ExpressionTreeVisitors.PartialEvaluatingExpressionTreeVisitor.VisitExpression(Expression expression)
   at Remotion.Data.Linq.Parsing.ExpressionTreeVisitors.PartialEvaluatingExpressionTreeVisitor.EvaluateIndependentSubtrees(Expression expressionTree)
   at NHibernate.Linq.NhLinqExpression..ctor(Expression expression)
   at NHibernate.Linq.NhQueryProvider.PrepareQuery(Expression expression, IQuery& query, NhLinqExpression& nhQuery)
   at NHibernate.Linq.NhQueryProvider.Execute(Expression expression)
   at NHibernate.Linq.NhQueryProvider.Execute[TResult](Expression expression)
   at System.Linq.Queryable.Count[TSource](IQueryable`1 source, Expression`1 predicate)
   at RCISP.NHibernate.Repository.IdentityRepositoryNh.IsExistOriginalIdentityForThisAlias(Identity item)
   at RCISP.Domain.Services.IdentityService.CreateIdentity(IRepositoryLocator locator, Person person)
   at RCISP.Domain.Services.IdentityService.LoadByPersonIdentificationCode(IRepositoryLocator locator, String identificationCode, Nullable`1 autoCreate)
   at RCISP.Domain.Services.EvidenceRequestService.Update[T](IRepositoryLocator locator, EvidenceRequestDto dto)
   at RCISP.Domain.Services.EvidenceRequestService.UpdateEntityCommand[T,TR](IRepositoryLocator locator, EvidenceRequestDto dto)
   at RCISP.Domain.Services.WeaponLicenseRequestService.<>c__DisplayClass4.<UpdateEntity>b__3(IRepositoryLocator locator)
   at RCISP.NHibernate.TransManager.TransManagerNh.ExecuteCommand[TResult](Func`2 command)
if(MyPerson != null)
{
  var q = SessionInstance.Query<Identity>()
       .Count(x => x.Person != null && x.Person.Id == MyPerson.Id);
}else
{
  // if you know when MyPerson is null count is zero, why you need to Query?
  // here count is zero..

}

EDIT 编辑

  var q = SessionInstance.Query<Identity>()
       .Count(x => MyPerson != null && x.Person != null && x.Person.Id == MyPerson.Id);

Whenever you have a NullReferenceException in any line of code and it's not clear where it can originate, start to split your long line of code into smaller ones, and do null checks. 每当在任何代码行中都有NullReferenceException,并且不清楚它的起源时,就开始将您的长代码拆分为较小的代码,并执行null检查。

For instance: 例如:

var q = SessionInstance.Query<Identity>();

if (q != null && MyPerson != null) {
   var count = q.Count(x => 
       x != null &&
       x.Person != null &&
       x.Person.Id == MyPerson.Id
   );
}
else {
   throw new InvalidOperationException("Something went wrong");
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM