Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/google-app-engine/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 高效转换IQueryable<;t来源>;不可变数组<;t来源>;一步使用异步和等待模式_C#_.net_Entity Framework_Entity Framework Core - Fatal编程技术网

C# 高效转换IQueryable<;t来源>;不可变数组<;t来源>;一步使用异步和等待模式

C# 高效转换IQueryable<;t来源>;不可变数组<;t来源>;一步使用异步和等待模式,c#,.net,entity-framework,entity-framework-core,C#,.net,Entity Framework,Entity Framework Core,我试图以最有效的方式将集合选择到不可变数组中 我还想明确结果集是只读/不可变/不可跟踪的 我也可以这样做: var someCollection = _dataContext .Set<someType>() .AsNoTracking() .ToImmutableArray(); var someCollection=\u dataContext .Set() .AsNoTracking() .ToImmutableArray(); 但这不是async

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

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

我也可以这样做:

var someCollection = _dataContext
    .Set<someType>()
    .AsNoTracking()
    .ToImmutableArray();
var someCollection=\u dataContext
.Set()
.AsNoTracking()
.ToImmutableArray();
但这不是
async

没有
ToImmutableArrayAsync()
的原因是什么

还是有更好的方法使用
async
从efcore获取不可变数组

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

var someImmutableCollection = someCollection
    .ToImmutableArray();
var someImmutableCollection = someCollection
    .ToImmutableArray();
疯了?没有那么多。让我们看一看


哦,哇,哈哈,我不知道它是在那个兜帽下做的。这是一个公平的回答。ToArrayAsync以这种方式实现有什么原因吗。是不是因为在源代码被枚举之前,集合的长度是未知的。@Spaceman简短回答是的。我还添加了一个更有效的化身,可以节省分配
var someImmutableCollection = someCollection
    .ToImmutableArray();
public static async Task<TSource[]> ToArrayAsync<TSource>(
     [NotNull] this IQueryable<TSource> source,
     CancellationToken cancellationToken = default)
       => (await source.ToListAsync(cancellationToken).ConfigureAwait(false))
           .ToArray(); // anti-climax
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
}
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();
}