在Dapper中使用IAsyncEnumerable重写GetAsync方法

问题描述 投票:0回答:1

我刚刚在这里了解了

QueryUnbufferedAsync
IAsyncEnumerable
https://www.learndapper.com/dapper-query/selecting-unbuffered-async 并想在我自己的数据服务类中使用它,但我做错了,因为这没有编译。我认为我弄乱了返回数据类型,但我不知道如何使用它。

这是我的代码:

private async Task<T> GetAsync2<T>(Func<DbConnection, Task<T>> operation)
{
    if (operation is null) { throw new ArgumentNullException(nameof(operation)); }

    await using DbConnection myCon = new SnowflakeDbConnection("myConnectionString");
    await myCon.OpenAsync();

    var result = await databaseOperation(myCon);

    return result;
}

public async Task<IAsyncEnumerable<T>> GetAllAsync<T>(string sqlSelect) => await GetAsync2(conn => conn.QueryUnbufferedAsync<T>(sqlSelect));

这是我得到的构建错误:

无法从用法中推断出方法“GetAsync2(Func)”的类型参数。

c# dapper iasyncenumerable
1个回答
0
投票

QueryUnbufferedAsync
返回
IAsyncEnumerable
。这不是
async Task<IAsyncEnumerable
,因为
IAsyncEnumerable
已经 异步友好。

因此您需要另一个接受非

Task
委托的重载。

但是,由于它是无缓冲的,因此在读取数据之前您无法关闭连接。因此,一旦数据完全读取,您需要(而且应该)依赖 Dapper 打开和关闭连接。只要在开始操作时关闭连接,Dapper 就可以处理这个问题。

private async Task<T> GetAsync2<T>(Func<DbConnection, T> operation)
{
    // do NOT add using
    DbConnection myCon = new SnowflakeDbConnection("myConnectionString");
    var result = databaseOperation(myCon);
    return result;
}
© www.soinside.com 2019 - 2024. All rights reserved.