diff --git a/src/NHibernate.Test/Linq/ParameterTypeLocatorTests.cs b/src/NHibernate.Test/Linq/ParameterTypeLocatorTests.cs index 2cb87bc50b2..511e23f88cd 100644 --- a/src/NHibernate.Test/Linq/ParameterTypeLocatorTests.cs +++ b/src/NHibernate.Test/Linq/ParameterTypeLocatorTests.cs @@ -84,6 +84,51 @@ public void EqualStringEnumTest() ); } + [Test] + public void EqualStringEnumTestWithFetch() + { + AssertResults( + new Dictionary> + { + {"3", o => o is EnumStoredAsStringType} + }, + db.Users.Fetch(o => o.Role).ThenFetch(o => o.ParentRole).Where(o => o.Enum1 == EnumStoredAsString.Large), + db.Users.Fetch(o => o.Role).ThenFetch(o => o.ParentRole).Where(o => EnumStoredAsString.Large == o.Enum1), + db.Timesheets.SelectMany(o => o.Users).Fetch(o => o.Role).Where(o => EnumStoredAsString.Large == o.Enum1), + db.Timesheets.FetchMany(o => o.Users).SelectMany(o => o.Users).Where(o => EnumStoredAsString.Large == o.Enum1), + db.Timesheets.FetchMany(o => o.Users).Where(o => o.Users.Any(u => EnumStoredAsString.Large == u.Enum1)) + ); + } + + [Test] + public void EqualStringEnumTestWithSubQuery() + { + AssertResults( + new Dictionary> + { + {"3", o => o is EnumStoredAsStringType} + }, + db.Users.Where(o => db.Users.Any(u => u.Enum1 == EnumStoredAsString.Large)), + db.Users.Where(o => db.Users.Any(u => EnumStoredAsString.Large == u.Enum1)), + db.Timesheets.Where(o => o.Users.Any(u => EnumStoredAsString.Large == u.Enum1)) + ); + } + + [Test] + public void EqualStringEnumTestWithMaxSubQuery() + { + AssertResults( + new Dictionary> + { + {"3", o => o is EnumStoredAsStringType} + }, + db.Users.Fetch(o => o.Role).Where(o => db.Users.Max(u => u.Enum1 == EnumStoredAsString.Large ? u.Id : -u.Id) == o.Id), + db.Users.Fetch(o => o.Role).Where(o => db.Users.Max(u => EnumStoredAsString.Large == u.Enum1 ? u.Id : -u.Id) == o.Id), + db.Users.Where(o => db.Users.Max(u => u.Enum1 == EnumStoredAsString.Large ? u.Id : -u.Id) == o.Id), + db.Users.Where(o => db.Users.Max(u => EnumStoredAsString.Large == u.Enum1 ? u.Id : -u.Id) == o.Id) + ); + } + [Test] public void EqualStringTest() { diff --git a/src/NHibernate/Util/ExpressionsHelper.cs b/src/NHibernate/Util/ExpressionsHelper.cs index eebee36c8dd..6f9f290aa72 100644 --- a/src/NHibernate/Util/ExpressionsHelper.cs +++ b/src/NHibernate/Util/ExpressionsHelper.cs @@ -714,6 +714,12 @@ protected override Expression VisitQuerySourceReference(QuerySourceReferenceExpr return node; } + protected override Expression VisitSubQuery(SubQueryExpression expression) + { + base.Visit(expression.QueryModel.SelectClause.Selector); + return expression; + } + protected override Expression VisitUnary(UnaryExpression node) { // Store only the outermost cast, when there are multiple casts for the same member