我使用的是 EfRepository<TEntity>
来访问数据,我有一个 DbSet<TEntity>
.我正试图异步访问数据,我需要它为 Queryable
而我目前正在使用这个。
public virtual async Task<IQueryable<TEntity>> AllAsync()
{
var list = await this.DbSet.ToListAsync();
return list.AsQueryable();
}
是否真的比使用 DbSet
同步?
它实际上比同步使用DbSet快吗?
实际上要慢很多很多。 在返回一个内存中的IQueryable之前,它会将所有实体加载到内存中。
你的附加的二级仓库应该直接将DbSet作为一个 IQueryable<T>
. 由调用代码来指定查询并同步或异步执行。
很多人都为EF写过 "通用仓库 "包装器。 它们都增加了复杂性,而且大多数都是弊大于利。
像大多数事情一样,这取决于。如果你是在控制台应用程序中运行,并且你的目标是尽可能快地将实体列表完全加载到内存中,同步调用会更快一些。如果你是在Web应用程序中运行这样的查询,那么你应该计划多个查询同时发生。 线程是Web应用程序中的宝贵资源。同步运行一个查询会占用一个线程,而这个线程可以在你的查询被IO阻塞时用来处理其他的Web请求。 所以你可以通过同步调用来最大化最后一个字节的时间,但你可以通过使用异步调用来最大化系统的整体吞吐量(并避免线程饥饿)。
最后,你可能需要衡量一下。