Skip to content

添加ToAsyncEnumerable返回异步流功能 #1982

@ROMYIM

Description

@ROMYIM

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

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions