【问题标题】:IAsyncEnumerable does not contain a definition for 'GetAwaiter' in ADO.NETIAsyncEnumerable 不包含 ADO.NET 中“GetAwaiter”的定义
【发布时间】:2020-08-21 02:08:04
【问题描述】:

.Net Core 3.1, C# 8 中的这段代码:

 await  dB.GetListAsync<OrigineDB>();  

导致此错误:

IAsyncEnumerable 不包含“GetAwaiter”的定义

此处提供的答案:https://stackoverflow.com/a/60148747/4180382 对我没有多大帮助,因为我的方法包含像示例中一样的 yield 和循环。

我应该做哪些改变?我不想返回列表。

 async IAsyncEnumerable<T> GetListAsync<T>() where T : class, new()
        {
            cn = new SqlConnection(cs);
            cn.Open();
            cmd = new SqlCommand(nameProcStock, cn);
            cmd.CommandType = CommandType.StoredProcedure;

            if (parms != null)
                foreach (KeyValuePair<string, object> kvp in parms)
                    cmd.Parameters.AddWithValue(kvp.Key, kvp.Value);

            dr = await cmd.ExecuteReaderAsync();
            while (dr.Read())
                yield return ConvertToObject<T>();
        }

【问题讨论】:

  • IAsyncEnumerable 应该在 foreach 循环中使用,然后你可以等待它
  • 好的,但是如何将 dr.Read() 更改为 foreach 循环?它返回一个布尔值。
  • GetObjectListAsync&lt;OrigineDB&gt;GetListAsync&lt;T&gt; 是如何相互关联的?
  • @PavelAnikhouski 更正了错字
  • @CodeNotFound .net core 3.1

标签: c# .net-core-3.1 iasyncenumerable


【解决方案1】:

如果一个方法返回一个IAsyncEnumerable&lt;T&gt; 类型的对象,你不能等待它,事实上你不必等待。您可以简单地在异步 foreach 循环中使用它,并在循环体中使用它的内容。

您可以像这样使用IAsyncEnumerable&lt;T&gt;

await foreach (var item in db.GetListAsync<OrigineDB>()) 
{
    // do what ever you want
}

【讨论】:

  • 好的,但我希望返回一个 IEnumerable 对象,而不必循环遍历它...
  • @OleEHDufour 为什么?然后调用函数的返回类型需要是Task&lt;IEnumerable&lt;..&gt;&gt;,这对于调用调用方法没有帮助,因为它只能在整个 list 准备好枚举后继续
猜你喜欢
  • 2020-05-25
  • 1970-01-01
  • 2012-08-04
  • 2017-04-20
  • 2017-11-20
  • 2018-08-21
  • 2016-12-15
  • 2017-04-08
  • 1970-01-01
相关资源
最近更新 更多