Skip to content

Evaluation failure when using Nullable without a value in LINQ #3156

Closed
@krzkowal

Description

@krzkowal

Using Nullable<T>.HasValue in LINQ throws NHibernate.HibernateException: Evaluation failure on null.HasValue if no value is set.

Test case
[Test]
public void CanUseNullableWithoutAValue()
{
    bool? isActive = null;

    Assert.DoesNotThrow(
        () => _ = session.Query<Role>()
                     .Where(r => !isActive.HasValue || r.IsActive == isActive.Value)
                     .ToList());
}
Error details
NHibernate.HibernateException: Evaluation failure on null.HasValue ---> System.Reflection.TargetException: Non-static method requires a target.
   at System.Reflection.RuntimeMethodInfo.CheckConsistency(Object target)
   at System.Reflection.RuntimeMethodInfo.InvokeArgumentsCheck(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture)
   at System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture)
   at System.Reflection.RuntimePropertyInfo.GetValue(Object obj, Object[] index)
   at NHibernate.Impl.ExpressionProcessor.FindValue(Expression expression) in C:\src\nhibernate-core\src\NHibernate\Impl\ExpressionProcessor.cs:line 269
   at NHibernate.Linq.Visitors.NhPartialEvaluatingExpressionVisitor.EvaluateSubtree(Expression subtree) in C:\src\nhibernate-core\src\NHibernate\Linq\Visitors\NhPartialEvaluatingExpressionVisitor.cs:line 151
   at NHibernate.Linq.Visitors.NhPartialEvaluatingExpressionVisitor.Visit(Expression expression) in C:\src\nhibernate-core\src\NHibernate\Linq\Visitors\NhPartialEvaluatingExpressionVisitor.cs:line 92
   --- End of inner exception stack trace ---
   at NHibernate.Linq.Visitors.NhPartialEvaluatingExpressionVisitor.Visit(Expression expression) in C:\src\nhibernate-core\src\NHibernate\Linq\Visitors\NhPartialEvaluatingExpressionVisitor.cs:line 99
   at System.Linq.Expressions.ExpressionVisitor.VisitUnary(UnaryExpression node)
   at System.Linq.Expressions.UnaryExpression.Accept(ExpressionVisitor visitor)
   at System.Linq.Expressions.ExpressionVisitor.Visit(Expression node)
   at NHibernate.Linq.Visitors.NhPartialEvaluatingExpressionVisitor.Visit(Expression expression) in C:\src\nhibernate-core\src\NHibernate\Linq\Visitors\NhPartialEvaluatingExpressionVisitor.cs:line 87
   at System.Linq.Expressions.ExpressionVisitor.VisitBinary(BinaryExpression node)
   at System.Linq.Expressions.BinaryExpression.Accept(ExpressionVisitor visitor)
   at System.Linq.Expressions.ExpressionVisitor.Visit(Expression node)
   at NHibernate.Linq.Visitors.NhPartialEvaluatingExpressionVisitor.Visit(Expression expression) in C:\src\nhibernate-core\src\NHibernate\Linq\Visitors\NhPartialEvaluatingExpressionVisitor.cs:line 87
   at System.Linq.Expressions.ExpressionVisitor.VisitLambda[T](Expression`1 node)
   at System.Linq.Expressions.Expression`1.Accept(ExpressionVisitor visitor)
   at System.Linq.Expressions.ExpressionVisitor.Visit(Expression node)
   at NHibernate.Linq.Visitors.NhPartialEvaluatingExpressionVisitor.Visit(Expression expression) in C:\src\nhibernate-core\src\NHibernate\Linq\Visitors\NhPartialEvaluatingExpressionVisitor.cs:line 87
   at System.Linq.Expressions.ExpressionVisitor.VisitUnary(UnaryExpression node)
   at System.Linq.Expressions.UnaryExpression.Accept(ExpressionVisitor visitor)
   at System.Linq.Expressions.ExpressionVisitor.Visit(Expression node)
   at NHibernate.Linq.Visitors.NhPartialEvaluatingExpressionVisitor.Visit(Expression expression) in C:\src\nhibernate-core\src\NHibernate\Linq\Visitors\NhPartialEvaluatingExpressionVisitor.cs:line 87
   at System.Linq.Expressions.ExpressionVisitor.VisitArguments(IArgumentProvider nodes)
   at System.Linq.Expressions.ExpressionVisitor.VisitMethodCall(MethodCallExpression node)
   at System.Linq.Expressions.MethodCallExpression.Accept(ExpressionVisitor visitor)
   at System.Linq.Expressions.ExpressionVisitor.Visit(Expression node)
   at NHibernate.Linq.Visitors.NhPartialEvaluatingExpressionVisitor.Visit(Expression expression) in C:\src\nhibernate-core\src\NHibernate\Linq\Visitors\NhPartialEvaluatingExpressionVisitor.cs:line 87
   at NHibernate.Linq.Visitors.NhPartialEvaluatingExpressionVisitor.EvaluateIndependentSubtrees(Expression expressionTree, PreTransformationParameters preTransformationParameters) in C:\src\nhibernate-core\src\NHibernate\Linq\Visitors\NhPartialEvaluatingExpressionVisitor.cs:line 60
   at NHibernate.Linq.NhRelinqQueryParser.PreTransform(Expression expression, PreTransformationParameters parameters) in C:\src\nhibernate-core\src\NHibernate\Linq\NhRelinqQueryParser.cs:line 70
   at NHibernate.Linq.NhLinqExpression..ctor(QueryMode queryMode, Expression expression, ISessionFactoryImplementor sessionFactory) in C:\src\nhibernate-core\src\NHibernate\Linq\NhLinqExpression.cs:line 50
   at NHibernate.Linq.NhLinqExpression..ctor(Expression expression, ISessionFactoryImplementor sessionFactory) in C:\src\nhibernate-core\src\NHibernate\Linq\NhLinqExpression.cs:line 43
   at NHibernate.Linq.DefaultQueryProvider.PrepareQuery(Expression expression, IQuery& query) in C:\src\nhibernate-core\src\NHibernate\Linq\DefaultQueryProvider.cs:line 204
   at NHibernate.Linq.DefaultQueryProvider.ExecuteList[TResult](Expression expression) in C:\src\nhibernate-core\src\NHibernate\Linq\DefaultQueryProvider.cs:line 107
   at NHibernate.Linq.NhQueryable`1.System.Collections.Generic.IEnumerable<T>.GetEnumerator() in C:\src\nhibernate-core\src\NHibernate\Linq\NhQueryable.cs:line 65
   at System.Collections.Generic.List`1..ctor(IEnumerable`1 collection)
   at System.Linq.Enumerable.ToList[TSource](IEnumerable`1 source)
   at NHibernate.Test.Linq.WhereTests.<>c__DisplayClass59_0.<CanUseNullableWithoutAValue>b__0() in C:\src\nhibernate-core\src\NHibernate.Test\Linq\WhereTests.cs:line 760

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions