Skip to content

Commit 44c1b40

Browse files
committed
Fix In extension in async queries
1 parent 0f7e65c commit 44c1b40

2 files changed

Lines changed: 37 additions & 4 deletions

File tree

Orm/Xtensive.Orm/Orm/Providers/SqlIncludeProvider.cs

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,8 @@
1414
using Tuple = Xtensive.Tuples.Tuple;
1515
using Xtensive.Orm.Rse;
1616
using Xtensive.Orm.Rse.Providers;
17+
using System.Threading.Tasks;
18+
using System.Threading;
1719

1820
namespace Xtensive.Orm.Providers
1921
{
@@ -51,6 +53,29 @@ protected override void OnBeforeEnumerate(Rse.Providers.EnumerationContext conte
5153
}
5254
}
5355

56+
protected override async Task OnBeforeEnumerateAsync(Rse.Providers.EnumerationContext context, CancellationToken token)
57+
{
58+
await base.OnBeforeEnumerateAsync(context, token).ConfigureAwait(false);
59+
60+
switch (Origin.Algorithm) {
61+
case IncludeAlgorithm.Auto:
62+
var filterData = filterDataSource.Invoke().ToList();
63+
if (filterData.Count > WellKnown.MaxNumberOfConditions)
64+
await LockAndStoreAsync(context, filterData, token).ConfigureAwait(false);
65+
else
66+
context.SetValue(filterDataSource, RowFilterDataName, filterData);
67+
break;
68+
case IncludeAlgorithm.ComplexCondition:
69+
// nothing
70+
break;
71+
case IncludeAlgorithm.TemporaryTable:
72+
await LockAndStoreAsync(context, filterDataSource.Invoke(), token);
73+
break;
74+
default:
75+
throw new ArgumentOutOfRangeException("Origin.Algorithm");
76+
}
77+
}
78+
5479
/// <inheritdoc/>
5580
protected override void OnAfterEnumerate(Rse.Providers.EnumerationContext context)
5681
{

Orm/Xtensive.Orm/Orm/Rse/RecordSet.cs

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -111,8 +111,15 @@ private async Task<IEnumerator<Tuple>> GetGreedyEnumeratorAsync(CancellationToke
111111
/// </summary>
112112
private async Task<IEnumerator<Tuple>> GetBatchedEnumeratorAsync(CancellationToken token)
113113
{
114-
EnumerationScope currentScope = null;
115-
var enumerator = await Source.GetEnumeratorAsync(Context, token).ConfigureAwait(false);
114+
var currentScope = Context.Activate();
115+
IEnumerator<Tuple> enumerator = null;
116+
try {
117+
enumerator = await Source.GetEnumeratorAsync(Context, token).ConfigureAwait(false);
118+
}
119+
finally {
120+
currentScope.DisposeSafely();
121+
}
122+
116123
var batched = enumerator.ToEnumerable().Batch(2);
117124

118125
var cs = Context.BeginEnumeration();
@@ -124,10 +131,11 @@ private async Task<IEnumerator<Tuple>> GetBatchedEnumeratorAsync(CancellationTok
124131
completableScope.Complete();
125132
completableScope.Dispose();
126133
};
127-
return GetTwoLevelEnumerator(batched, afterEnumerationAction, cs);
134+
return GetTwoLevelEnumerator(batched, afterEnumerationAction, cs);
128135
}
129136

130-
private static IEnumerator<Tuple> GetTwoLevelEnumerator(IEnumerable<IEnumerable<Tuple>> enumerable, Action<object> afterEnumerationAction, object parameterForAction)
137+
private static IEnumerator<Tuple> GetTwoLevelEnumerator(IEnumerable<IEnumerable<Tuple>> enumerable,
138+
Action<object> afterEnumerationAction, ICompletableScope parameterForAction)
131139
{
132140
try {
133141
foreach (var batch in enumerable)

0 commit comments

Comments
 (0)