From 08cefb32ddec47976d1868189982293d869e7010 Mon Sep 17 00:00:00 2001 From: Shay Rojansky Date: Tue, 5 Aug 2025 00:24:50 +0200 Subject: [PATCH] Dispose related readers in GroupBySplitQueryingEnumerable (#36484) (#36489) Fixes #34280 (cherry picked from commit 08f094b6823df39d5b2894dbc64f90143e917259) --- .../GroupBySplitQueryingEnumerable.cs | 37 +++++++++++++++---- .../Query/Internal/SplitQueryingEnumerable.cs | 2 + 2 files changed, 32 insertions(+), 7 deletions(-) diff --git a/src/EFCore.Relational/Query/Internal/GroupBySplitQueryingEnumerable.cs b/src/EFCore.Relational/Query/Internal/GroupBySplitQueryingEnumerable.cs index ae8d9e3e47d..12b16333b33 100644 --- a/src/EFCore.Relational/Query/Internal/GroupBySplitQueryingEnumerable.cs +++ b/src/EFCore.Relational/Query/Internal/GroupBySplitQueryingEnumerable.cs @@ -330,6 +330,19 @@ public void Dispose() { _relationalQueryContext.Connection.ReturnCommand(_relationalCommand!); _dataReader.Dispose(); + + if (_resultCoordinator != null) + { + foreach (var dataReader in _resultCoordinator.DataReaders) + { + dataReader?.DataReader.Dispose(); + } + + _resultCoordinator.DataReaders.Clear(); + + _resultCoordinator = null; + } + _dataReader = null; _dbDataReader = null; } @@ -503,20 +516,30 @@ private static async Task InitializeReaderAsync(AsyncEnumerator enumerator return false; } - public ValueTask DisposeAsync() + public async ValueTask DisposeAsync() { - if (_dataReader is not null) + if (_dataReader != null) { _relationalQueryContext.Connection.ReturnCommand(_relationalCommand!); + await _dataReader.DisposeAsync().ConfigureAwait(false); + + if (_resultCoordinator != null) + { + foreach (var dataReader in _resultCoordinator.DataReaders) + { + if (dataReader != null) + { + await dataReader.DataReader.DisposeAsync().ConfigureAwait(false); + } + } + + _resultCoordinator.DataReaders.Clear(); + _resultCoordinator = null; + } - var dataReader = _dataReader; _dataReader = null; _dbDataReader = null; - - return dataReader.DisposeAsync(); } - - return default; } } } diff --git a/src/EFCore.Relational/Query/Internal/SplitQueryingEnumerable.cs b/src/EFCore.Relational/Query/Internal/SplitQueryingEnumerable.cs index c87544d1120..830fbb25470 100644 --- a/src/EFCore.Relational/Query/Internal/SplitQueryingEnumerable.cs +++ b/src/EFCore.Relational/Query/Internal/SplitQueryingEnumerable.cs @@ -251,6 +251,7 @@ public void Dispose() { _relationalQueryContext.Connection.ReturnCommand(_relationalCommand!); _dataReader.Dispose(); + if (_resultCoordinator != null) { foreach (var dataReader in _resultCoordinator.DataReaders) @@ -407,6 +408,7 @@ public async ValueTask DisposeAsync() { _relationalQueryContext.Connection.ReturnCommand(_relationalCommand!); await _dataReader.DisposeAsync().ConfigureAwait(false); + if (_resultCoordinator != null) { foreach (var dataReader in _resultCoordinator.DataReaders)