C# 异步分页<;T>;异步获取第一个结果

C# 异步分页<;T>;异步获取第一个结果,c#,async-await,C#,Async Await,我有AsyncPageable,只想从列表中获取第一个结果 MS docs建议使用wait foreach // call a service method, which returns AsyncPageable<T> AsyncPageable<SecretProperties> allSecretProperties = client.GetPropertiesOfSecretsAsync(); await foreach (SecretProperties se

我有
AsyncPageable
,只想从列表中获取第一个结果

MS docs建议使用
wait foreach

// call a service method, which returns AsyncPageable<T>
AsyncPageable<SecretProperties> allSecretProperties = client.GetPropertiesOfSecretsAsync();

await foreach (SecretProperties secretProperties in allSecretProperties)
{
    Console.WriteLine(secretProperties.Name);
}
由于
AsyncPageable
实现了
IAsyncEnumerable
,因此您可以安装nuget并使用它提供的方法:

var result = await allSecretProperties.FirstOrDefaultAsync();

只需将您拥有的内容包装到扩展方法中

// hrmmm, im not sure
public static async Task<T> FirstOrDefaultAsync<T>(this IAsyncEnumerable<T> enumerable)
{
   await foreach (var item in enumerable)
      return item;
   return default;
}

// This is more efficient 
public static async Task<T> FirstOrDefaultAsync2<T>(this IAsyncEnumerable<T> enumerable)
{
   var enumerator = enumerable.GetAsyncEnumerator();
   await enumerator.MoveNextAsync();
   return enumerator.Current;
}
//嗯,我不确定
公共静态异步任务FirstOrDefaultAsync(此IAsyncEnumerable可枚举)
{
等待foreach(可枚举中的变量项)
退货项目;
返回默认值;
}
//这样效率更高
公共静态异步任务FirstOrDefaultAsync2(此IAsyncEnumerable可枚举)
{
var enumerator=enumerable.GetAsyncEnumerator();
等待枚举数。MoveNextAsync();
返回枚举数.Current;
}

它不是专门为适应此用例而构建的。我可能只是在
等待foreach
中使用一个无条件的
中断
,而不是挖掘枚举器机制。当然,你仍然需要处理0个结果。你正在尽可能地提高效率。只需将其包装在扩展方法中。为此方法拉入库是一种浪费
IAsyncEnumerable
不包含
FirstOrDefaultAsync
,因此这不起作用。@DeivydasVoroneckis是否安装了NuGet?注意:将
System.Linq.Async
与EFCore一起使用会导致我的整个解决方案因对所有Linq
的模糊引用而中断。其中
导入
System.Linq
Microsoft.EntityFrameworkCore
的文件中的子句。已知问题请参见:和@ttugates
Microsoft.EntityFrameworkCore
与此相关吗?你读过OP的问题了吗?@rytisk-这是一个合理的评论,可以预期与半年内发布的>500个用户中的一个重要子集相关。使用
AsyncPageable
(一个MS Azure库,碰巧也使用MS EFCore)的用户可以受益于我评论中的免费信息。这是我希望在遵循您发布的这个完全有效的答案之前知道的信息。Re:“你读过OP的问题了吗?”-如果你想深入讨论对话,我很乐意与你聊天。效率更高,部分原因是它不尊重异步处理。@Damien_不信者是的,我一直在试图弄清楚这是否会引起问题。另外,在看了这两个代码块一段时间后,我认为从美学角度来说,我会选择foreach
// hrmmm, im not sure
public static async Task<T> FirstOrDefaultAsync<T>(this IAsyncEnumerable<T> enumerable)
{
   await foreach (var item in enumerable)
      return item;
   return default;
}

// This is more efficient 
public static async Task<T> FirstOrDefaultAsync2<T>(this IAsyncEnumerable<T> enumerable)
{
   var enumerator = enumerable.GetAsyncEnumerator();
   await enumerator.MoveNextAsync();
   return enumerator.Current;
}