diff --git a/src/NHibernate.Test/Async/Linq/WhereSubqueryTests.cs b/src/NHibernate.Test/Async/Linq/WhereSubqueryTests.cs index 713b931e3b7..38303f0986d 100644 --- a/src/NHibernate.Test/Async/Linq/WhereSubqueryTests.cs +++ b/src/NHibernate.Test/Async/Linq/WhereSubqueryTests.cs @@ -707,5 +707,30 @@ public async Task NullComparedToMemberInitExpressionInWhereClauseAsync() Assert.That(result.Count, Is.EqualTo(45)); } + + public class Specification + { + private Expression> _expression; + + public Specification(Expression> expression) + { + _expression = expression; + } + + public static implicit operator Expression>(Specification specification) + { + return specification._expression; + } + } + + [Test] + public async Task ImplicitConversionInsideWhereSubqueryExpressionAsync() + { + if (!Dialect.SupportsScalarSubSelects) + Assert.Ignore(Dialect.GetType().Name + " does not support scalar sub-queries"); + + var spec = new Specification(x => x.Freight > 1000); + await (db.Orders.Where(o => db.Orders.Where(spec).Any(x => x.OrderId == o.OrderId)).ToListAsync()); + } } } diff --git a/src/NHibernate.Test/Linq/WhereSubqueryTests.cs b/src/NHibernate.Test/Linq/WhereSubqueryTests.cs index 99437428623..9531ccf7273 100644 --- a/src/NHibernate.Test/Linq/WhereSubqueryTests.cs +++ b/src/NHibernate.Test/Linq/WhereSubqueryTests.cs @@ -788,5 +788,30 @@ public void NullComparedToMemberInitExpressionInWhereClause() Assert.That(result.Count, Is.EqualTo(45)); } + + public class Specification + { + private Expression> _expression; + + public Specification(Expression> expression) + { + _expression = expression; + } + + public static implicit operator Expression>(Specification specification) + { + return specification._expression; + } + } + + [Test] + public void ImplicitConversionInsideWhereSubqueryExpression() + { + if (!Dialect.SupportsScalarSubSelects) + Assert.Ignore(Dialect.GetType().Name + " does not support scalar sub-queries"); + + var spec = new Specification(x => x.Freight > 1000); + db.Orders.Where(o => db.Orders.Where(spec).Any(x => x.OrderId == o.OrderId)).ToList(); + } } } diff --git a/src/NHibernate/Linq/Visitors/NhPartialEvaluatingExpressionVisitor.cs b/src/NHibernate/Linq/Visitors/NhPartialEvaluatingExpressionVisitor.cs index 475dbcdad31..c92403cbc82 100644 --- a/src/NHibernate/Linq/Visitors/NhPartialEvaluatingExpressionVisitor.cs +++ b/src/NHibernate/Linq/Visitors/NhPartialEvaluatingExpressionVisitor.cs @@ -157,7 +157,9 @@ private Expression EvaluateSubtree(Expression subtree) private bool ContainsVariable(Expression expression) { - if (!(expression is UnaryExpression unaryExpression)) + if (!(expression is UnaryExpression unaryExpression) || + // Avoid detecting expression variables as parameters + typeof(Expression).IsAssignableFrom(expression.Type)) { return false; }