From 12f92042542d0e12deecae8ded5667804bc15cff Mon Sep 17 00:00:00 2001 From: Alex Zaytsev Date: Sun, 30 Aug 2020 22:18:37 +1200 Subject: [PATCH] Flatten AsQueryableResultOperator Fixes #2471 --- src/NHibernate.Test/Async/Linq/WhereSubqueryTests.cs | 11 +++++++++++ src/NHibernate.Test/Linq/WhereSubqueryTests.cs | 11 +++++++++++ .../Linq/Visitors/SubQueryFromClauseFlattener.cs | 4 +++- 3 files changed, 25 insertions(+), 1 deletion(-) diff --git a/src/NHibernate.Test/Async/Linq/WhereSubqueryTests.cs b/src/NHibernate.Test/Async/Linq/WhereSubqueryTests.cs index 2e67bea1c82..713b931e3b7 100644 --- a/src/NHibernate.Test/Async/Linq/WhereSubqueryTests.cs +++ b/src/NHibernate.Test/Async/Linq/WhereSubqueryTests.cs @@ -328,6 +328,17 @@ where timesheet.Entries.AsQueryable().Any(e => !new[] { 1 }.Contains(e.Id)) Assert.That(query.Count, Is.EqualTo(2)); } + [Test(Description = "GH-2471")] + public async Task TimeSheetsWithStringContainsSubQueryWithAsQueryableAfterWhereAsync() + { + var query = await (( + from timesheet in db.Timesheets + where timesheet.Entries.Where(e => e.Comments != null).AsQueryable().Any(e => e.Comments.Contains("testing")) + select timesheet).ToListAsync()); + + Assert.That(query.Count, Is.EqualTo(2)); + } + [Test(Description = "NH-3002")] public async Task HqlOrderLinesWithInnerJoinAndSubQueryAsync() { diff --git a/src/NHibernate.Test/Linq/WhereSubqueryTests.cs b/src/NHibernate.Test/Linq/WhereSubqueryTests.cs index f272d438707..99437428623 100644 --- a/src/NHibernate.Test/Linq/WhereSubqueryTests.cs +++ b/src/NHibernate.Test/Linq/WhereSubqueryTests.cs @@ -372,6 +372,17 @@ where timesheet.Entries.AsQueryable().Any(e => !new[] { 1 }.Contains(e.Id)) Assert.That(query.Count, Is.EqualTo(2)); } + [Test(Description = "GH-2471")] + public void TimeSheetsWithStringContainsSubQueryWithAsQueryableAfterWhere() + { + var query = ( + from timesheet in db.Timesheets + where timesheet.Entries.Where(e => e.Comments != null).AsQueryable().Any(e => e.Comments.Contains("testing")) + select timesheet).ToList(); + + Assert.That(query.Count, Is.EqualTo(2)); + } + [Test(Description = "NH-3002")] public void HqlOrderLinesWithInnerJoinAndSubQuery() { diff --git a/src/NHibernate/Linq/Visitors/SubQueryFromClauseFlattener.cs b/src/NHibernate/Linq/Visitors/SubQueryFromClauseFlattener.cs index 82b33c27b1d..51d276340c8 100644 --- a/src/NHibernate/Linq/Visitors/SubQueryFromClauseFlattener.cs +++ b/src/NHibernate/Linq/Visitors/SubQueryFromClauseFlattener.cs @@ -4,6 +4,7 @@ using Remotion.Linq.Clauses; using Remotion.Linq.Clauses.Expressions; using Remotion.Linq.Clauses.ExpressionVisitors; +using Remotion.Linq.Clauses.ResultOperators; using Remotion.Linq.EagerFetching; namespace NHibernate.Linq.Visitors @@ -15,7 +16,8 @@ public class SubQueryFromClauseFlattener : NhQueryModelVisitorBase typeof(LockResultOperator), typeof(FetchLazyPropertiesResultOperator), typeof(FetchOneRequest), - typeof(FetchManyRequest) + typeof(FetchManyRequest), + typeof(AsQueryableResultOperator) }; public static void ReWrite(QueryModel queryModel)