C#ASP.NET核心实体框架核心异步ToQueryable比较



我正在使用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应用程序中的宝贵资源。同步运行查询将占用一个线程,该线程可用于在查询处于I/O阻塞时处理其他web请求。因此,您可以通过进行同步调用来最大限度地延长到最后一个字节的时间,但也可以通过使用异步调用来最大程度地提高系统的整体吞吐量(并避免线程饥饿(。

最后,你可能需要测量它

最新更新