我有一些C#,其中我在connection(ExecuteReader)上创建一个阅读器,然后对于该阅读器中的每一行,执行另一个命令(with ExecuteNonQuery).在这种情况下,我MultipleActiveResultSets=True在连接上使用或使用多个连接更好吗?
我正在使用 EF Core 5.0 并有以下代码:
public async IAsyncEnumerable<Item> GetItems([EnumeratorCancellation] CancellationToken cancellationToken = default)
{
await using var ctx = _DbContextFunc();
//Isolationlevel is required to not cause any issues with parallel working on already read items
await ctx.Database.BeginTransactionAsync(IsolationLevel.ReadUncommitted, cancellationToken).ConfigureAwait(false);
await foreach (var item in ctx.Item.
.AsSplitQuery()
.Include(i => i.ItemDetail1)
.Include(i => i.ItemDetail2)
.OrderByDescending(i => i.ItemId)
.AsNoTracking()
.AsAsyncEnumerable()
.WithCancellation(cancellationToken))
{
yield return item;
}
}
Run Code Online (Sandbox Code Playgroud)
它按预期工作,允许我在仍在加载更多数据的同时填充数据网格。如果我取消提供的 CancelationToken,首先我会在 MoveNextAsync() 行上收到预期的 TaskCanceledException。
但是:我可以在 SQL Profiler 中看到 SQL 查询本身不会中止,而是始终运行,直到加载所有数据,然后我才能在同一行上收到第二个 TaskCanceledException。
如何中止查询本身?
我将 AsSplitQuery() 添加到示例中,因为事实证明它是我所经历的行为的原因(正如 …