首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >EF Core/LINQ - Select()和异步急切加载之间的最佳解决方案?

问EF Core/LINQ - Select()和异步急切加载之间的最佳解决方案?
EN

Stack Overflow用户
提问于 2022-11-05 20:00:42
回答 1查看 60关注 0票数 0

我想使用Select()方法,但似乎Select()并没有真正接受等待关键字。因此,我在问自己这个问题,我是应该继续异步地使用急切的加载,还是实际上Select是非常好的同步加载方法,并且将与其他方法一样高效地完成工作?

我使用Select()将一个非常大的实体映射到DTO,并希望通过创建一组方法(包括一些关系,如GetObjectWithPrice和GetObjectWithPriceAndDate )来基本上模拟Select()方法,这就是为什么我要求使用Select()方法,但同步性让我担心。

编辑

要回答@AvrohomYisroel,下面是我迄今为止对代码所做的工作:

代码语言:javascript
复制
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()的使用是同步的,因为它的工作方式与我所认为的不同,所以我可能完全被蒙在鼓里。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-11-06 01:00:35

如果.Select()或performed on the 通常是最有效的数据检索形式,但是当我们使用投影时,就排除了includes的使用。.Select()将更改对象图的形状,如果不更改形状,则只需使用.Include(),当需要包含相关实体时,.AsSplitQuery()将为您提供最佳性能,因为它将作为单个查询加载每个导航路径。

之间时,性能问题不再那么重要。

投影的目的不仅是撤回所需的相关导航实体,还包括我们需要的特定字段。.Select()是一种比.Include()更迫切的加载形式,但允许您选择要加载的字段。

但我们不能同时拥有.Include()expressed before the.Select()will be ignored unless the.IQueryable()has been loaded into an.IEnumerable()`和.Select()。

至于异步性,如果将.Select()或.Include()应用于IQueryable<T>表达式,则以下内容仍然是异步的:

代码语言:javascript
复制
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>和同步评估。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74331081

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档