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();
}