0

EfRepository<TEntity>用来访问数据,我有一个DbSet<TEntity>. 我正在尝试异步访问数据,我需要它Queryable,我目前正在使用它:

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

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

4

2 回答 2

4

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

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

您的附加二级存储库应直接将 DbSet 作为IQueryable<T>. 由调用代码指定查询并同步或异步执行它。

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

于 2020-04-24T16:54:29.427 回答
0

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

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

于 2020-04-24T17:46:50.103 回答