我想使用Select()方法,但似乎Select()并没有真正接受等待关键字。因此,我在问自己这个问题,我是应该继续异步地使用急切的加载,还是实际上Select是非常好的同步加载方法,并且将与其他方法一样高效地完成工作?
我使用Select()将一个非常大的实体映射到DTO,并希望通过创建一组方法(包括一些关系,如GetObjectWithPrice和GetObjectWithPriceAndDate )来基本上模拟Select()方法,这就是为什么我要求使用Select()方法,但同步性让我担心。
编辑
要回答@AvrohomYisroel,下面是我迄今为止对代码所做的工作:
public async Task<IReadOnlyList<Book>> GetAllBooksWithRelatedDataAsync()
{
var books = await context.Books
.AsNoTracking()
.AsSplitQuery()
.Include(d => d.Price)
.Include(d => d.Images)
.Include(d => d.Author)
.ToListAsync();
return books;
}这就是我如何异步使用急切加载的方式。我一直在质疑,当我使用asynchronicity.的时候,我应该希望它是使用的方式。然而,由于Select()的使用是同步的,因为它的工作方式与我所认为的不同,所以我可能完全被蒙在鼓里。
发布于 2022-11-06 01:00:35
如果.Select()或performed on the 通常是最有效的数据检索形式,但是当我们使用投影时,就排除了includes的使用。.Select()将更改对象图的形状,如果不更改形状,则只需使用.Include(),当需要包含相关实体时,.AsSplitQuery()将为您提供最佳性能,因为它将作为单个查询加载每个导航路径。
.Select()在存储库模式中经常用于将数据模型映射到DTO中,您还可以使用其他库来简化这一点,这将在内部调用.Select()..AsSplitQuery(),这意味着在选择热切加载和Projections.之间时,性能问题不再那么重要。
投影的目的不仅是撤回所需的相关导航实体,还包括我们需要的特定字段。.Select()是一种比.Include()更迫切的加载形式,但允许您选择要加载的字段。
但我们不能同时拥有.Include()expressed before the.Select()will be ignored unless the.IQueryable()has been loaded into an.IEnumerable()`和.Select()。
至于异步性,如果将.Select()或.Include()应用于IQueryable<T>表达式,则以下内容仍然是异步的:
var books = await context. Books
.Select(b => new BookDTO {
ISBN = b.BookNumber,
Title = b.Title,
Author = b.Author.Name,
Price = b.Price,
Images = b.Images.Select(i => i.Url)
})
.AsSplitQuery()
.ToListAsync();.Select()可能将您限制到同步上下文的唯一时间是在投影中使用了不能转换为数据存储(SQL)表达式的函数或逻辑。在这种情况下,perform将自动评估您的表达式以将数据带入内存,然后执行.Select()。此时,您正在处理IEnumerable<T>和同步评估。
https://stackoverflow.com/questions/74331081
复制相似问题