Skip to content

Commit cf1cc9c

Browse files
authored
Fix detecting parameter types in subqueries for Linq provider (#2443)
Fixes #2439
1 parent 0a2b1bb commit cf1cc9c

File tree

2 files changed

+51
-0
lines changed

2 files changed

+51
-0
lines changed

src/NHibernate.Test/Linq/ParameterTypeLocatorTests.cs

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,51 @@ public void EqualStringEnumTest()
8484
);
8585
}
8686

87+
[Test]
88+
public void EqualStringEnumTestWithFetch()
89+
{
90+
AssertResults(
91+
new Dictionary<string, Predicate<IType>>
92+
{
93+
{"3", o => o is EnumStoredAsStringType}
94+
},
95+
db.Users.Fetch(o => o.Role).ThenFetch(o => o.ParentRole).Where(o => o.Enum1 == EnumStoredAsString.Large),
96+
db.Users.Fetch(o => o.Role).ThenFetch(o => o.ParentRole).Where(o => EnumStoredAsString.Large == o.Enum1),
97+
db.Timesheets.SelectMany(o => o.Users).Fetch(o => o.Role).Where(o => EnumStoredAsString.Large == o.Enum1),
98+
db.Timesheets.FetchMany(o => o.Users).SelectMany(o => o.Users).Where(o => EnumStoredAsString.Large == o.Enum1),
99+
db.Timesheets.FetchMany(o => o.Users).Where(o => o.Users.Any(u => EnumStoredAsString.Large == u.Enum1))
100+
);
101+
}
102+
103+
[Test]
104+
public void EqualStringEnumTestWithSubQuery()
105+
{
106+
AssertResults(
107+
new Dictionary<string, Predicate<IType>>
108+
{
109+
{"3", o => o is EnumStoredAsStringType}
110+
},
111+
db.Users.Where(o => db.Users.Any(u => u.Enum1 == EnumStoredAsString.Large)),
112+
db.Users.Where(o => db.Users.Any(u => EnumStoredAsString.Large == u.Enum1)),
113+
db.Timesheets.Where(o => o.Users.Any(u => EnumStoredAsString.Large == u.Enum1))
114+
);
115+
}
116+
117+
[Test]
118+
public void EqualStringEnumTestWithMaxSubQuery()
119+
{
120+
AssertResults(
121+
new Dictionary<string, Predicate<IType>>
122+
{
123+
{"3", o => o is EnumStoredAsStringType}
124+
},
125+
db.Users.Fetch(o => o.Role).Where(o => db.Users.Max(u => u.Enum1 == EnumStoredAsString.Large ? u.Id : -u.Id) == o.Id),
126+
db.Users.Fetch(o => o.Role).Where(o => db.Users.Max(u => EnumStoredAsString.Large == u.Enum1 ? u.Id : -u.Id) == o.Id),
127+
db.Users.Where(o => db.Users.Max(u => u.Enum1 == EnumStoredAsString.Large ? u.Id : -u.Id) == o.Id),
128+
db.Users.Where(o => db.Users.Max(u => EnumStoredAsString.Large == u.Enum1 ? u.Id : -u.Id) == o.Id)
129+
);
130+
}
131+
87132
[Test]
88133
public void EqualStringTest()
89134
{

src/NHibernate/Util/ExpressionsHelper.cs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -714,6 +714,12 @@ protected override Expression VisitQuerySourceReference(QuerySourceReferenceExpr
714714
return node;
715715
}
716716

717+
protected override Expression VisitSubQuery(SubQueryExpression expression)
718+
{
719+
base.Visit(expression.QueryModel.SelectClause.Selector);
720+
return expression;
721+
}
722+
717723
protected override Expression VisitUnary(UnaryExpression node)
718724
{
719725
// Store only the outermost cast, when there are multiple casts for the same member

0 commit comments

Comments
 (0)