C# ASP.NET Core Entity Framework Core异步ToQueryable比较

问题描述 投票:0回答:1

我使用的是 EfRepository<TEntity> 来访问数据,我有一个 DbSet<TEntity>.我正试图异步访问数据,我需要它为 Queryable 而我目前正在使用这个。

public virtual async Task<IQueryable<TEntity>> AllAsync()
{
    var list = await this.DbSet.ToListAsync();
    return list.AsQueryable();
}

是否真的比使用 DbSet 同步?

c# asynchronous entity-framework-core asqueryable
1个回答
4
投票

它实际上比同步使用DbSet快吗?

实际上要慢很多很多。 在返回一个内存中的IQueryable之前,它会将所有实体加载到内存中。

你的附加的二级仓库应该直接将DbSet作为一个 IQueryable<T>. 由调用代码来指定查询并同步或异步执行。

很多人都为EF写过 "通用仓库 "包装器。 它们都增加了复杂性,而且大多数都是弊大于利。


0
投票

像大多数事情一样,这取决于。如果你是在控制台应用程序中运行,并且你的目标是尽可能快地将实体列表完全加载到内存中,同步调用会更快一些。如果你是在Web应用程序中运行这样的查询,那么你应该计划多个查询同时发生。 线程是Web应用程序中的宝贵资源。同步运行一个查询会占用一个线程,而这个线程可以在你的查询被IO阻塞时用来处理其他的Web请求。 所以你可以通过同步调用来最大化最后一个字节的时间,但你可以通过使用异步调用来最大化系统的整体吞吐量(并避免线程饥饿)。

最后,你可能需要衡量一下。

© www.soinside.com 2019 - 2024. All rights reserved.