首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用异步和等待模式一步有效地将IQueryable<TSource>转换为ImmutableArray<TSource>

使用异步和等待模式一步有效地将IQueryable<TSource>转换为ImmutableArray<TSource>
EN

Stack Overflow用户
提问于 2020-10-20 03:31:01
回答 1查看 325关注 0票数 5

我试图以最有效的方式将集合选择到不可变的数组中。

我还想明确结果集的意图是只读/不变/不跟踪。

代码语言:javascript
复制
var someCollection = await _dataContext
    .Set<someType>()
    .AsNoTracking()
    .ToArrayAsync();

我可以这样做,然后转换为不变,但这似乎是疯狂的。

代码语言:javascript
复制
var someImmutableCollection = someCollection
    .ToImmutableArray();

我也可以这么做:

代码语言:javascript
复制
var someCollection = _dataContext
    .Set<someType>()
    .AsNoTracking()
    .ToImmutableArray();

但这不是async

没有ToImmutableArrayAsync()的原因吗?

或者,是否有更好的方法使用async从efcore获取不可变数组?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-10-20 03:38:13

我可以这样做,然后转换为不变,但这似乎是疯狂的。 var someImmutableCollection = someCollection .ToImmutableArray();

疯了吗?不是很多。让我们来看看源代码

代码语言:javascript
复制
public static async Task<TSource[]> ToArrayAsync<TSource>(
     [NotNull] this IQueryable<TSource> source,
     CancellationToken cancellationToken = default)
       => (await source.ToListAsync(cancellationToken).ConfigureAwait(false))
           .ToArray(); // anti-climax

好吧,那里没发生什么魔法。

只需创建您自己的扩展

代码语言:javascript
复制
public class MySuperExtensions
{   
    public static async Task<ImmutableArray<TSource>> ToImmutableArrayAsync<TSource>(
         [NotNull] this IQueryable<TSource> source,
         CancellationToken cancellationToken = default)
           => (await source.ToListAsync(cancellationToken).ConfigureAwait(false))
               .ToImmutableArray(); // yehaa
}

避免了危机,解决了问题。

或者更有效地节省额外的分配和IAsyncStateMachine实现

代码语言:javascript
复制
public static async Task<ImmutableArray<TSource>> ToImmutableArrayAsync<TSource>(
   [NotNull] this IQueryable<TSource> source,
   CancellationToken cancellationToken = default)
{
   var builder = ImmutableArray.CreateBuilder<TSource>();
   await foreach (var element in source.AsAsyncEnumerable().WithCancellation(cancellationToken))
       builder.Add(element);

   return builder.ToImmutable();
}
票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64438061

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档