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

I am using EfRepository<TEntity> to access data and I have a DbSet<TEntity>. I'm trying to access data asynchronously and I need it is as Queryable and I'm currently using this:

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

Is it actually faster than using the DbSet synchronously?

评论
  • psunt
    psunt 回复

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

    最后,您可能需要测量它。

  • 没人疼?
    没人疼? 回复
    它实际上比同步使用DbSet更快吗?

    实际上,速度要慢得多。在返回内存中的IQueryable之前,这会将所有实体加载到内存中。

    Your additional, second-level repository should return the DbSet directly as an IQueryable<T>. It's up to the calling code to specify the query and execute it either sync or async.

    许多人为EF编写了“通用存储库”包装。它们都增加了复杂性,其中大多数弊大于利。