-
Notifications
You must be signed in to change notification settings - Fork 888
Open
Description
Feature 特性
public class FreeSqlAsyncEnumerable<T>(DbDataReader reader) : IAsyncEnumerable<T>
{
public IAsyncEnumerator<T> GetAsyncEnumerator(CancellationToken cancellationToken = new CancellationToken())
{
return new FreeSqlAsyncEnumerator<T>(reader, cancellationToken);
}
}
public class FreeSqlAsyncEnumerator<T>(DbDataReader reader, CancellationToken cancellationToken) : IAsyncEnumerator<T>
{
public T Current => (T) Utils.ExecuteArrayRowReadClassOrTuple(flag, typeof(T), indexes, reader, 0, _util).Value;
public ValueTask<bool> MoveNextAsync()
{
return new ValueTask<bool>(reader.ReadAsync(cancellationToken));
}
public async ValueTask DisposeAsync()
{
await reader.CloseAsync();
await reader.DisposeAsync();
}
}
简要描述原因
针对大数据导出和后续处理非常有用。ToChunk和ToChunkAsync只支持传递委托进去,使得代码耦合。而且没有数据返回。
返回IAsyncEnumberable接口,可以把查询和后续数据处理分离出来,代码不耦合。而且还可以返回数据。其次避免ToListAsync中List扩容的数据复制带来的开销。
使用场景
freeSql.Select<T>.ToAsyncEnumerable(cancellationToken);
freeSql.Select<T>.ToAsyncEnumerable(t => new T2()
{
Id = t.Id
}, cancellationToken);
freeSql.Select<T1, T2>.ToAsyncEnumerable((t1, t2) => new T3()
{
Id = t1.Id,
Name = t2.Name
}, cancellationToken);
Metadata
Metadata
Assignees
Labels
No labels