0

I have a linq query by NHibernate.

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

But Check condition in Count Is not Valid. Because if value of MyPerson be null ,expected result of count is 0 but this query has a NullReferenceException By this message :

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)
Ehsan
  • 3,431
  • 8
  • 50
  • 70

2 Answers2

1
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);
Damith
  • 62,401
  • 13
  • 102
  • 153
0

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.

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");
}
knocte
  • 16,941
  • 11
  • 79
  • 125
  • Your answer is duplicate because my question is in the case how check condition in linq provider. – Ehsan Jul 03 '12 at 03:35