【问题标题】:EF Core, use include or again contextEF Core,使用包含或再次上下文
【发布时间】:2021-11-21 05:20:12
【问题描述】:

自:

“在单个查询中急于加载集合导航可能会导致 性能问题。”

见:Source

建议使用带有包含的拆分查询。我想知道是否不是包含在下面的查询中:

            var task = await context.Tasks                   
                .Include(x => x.TaskDependencies)                 
                .Select(x => new TaskBaseModel
                {
                    Id = x.Id,
                    Name = x.Name,
                    Description = x.Description,                        
                    TaskDependencies= x.TaskDependencies.ToArray()
                })
                .SingleOrDefaultAsync(x => x.Id == _id);

我应该这样做:

                var task = await context.Tasks                                                       
                    .Select(x => new TaskBaseModel
                    {
                        Id = x.Id,
                        Name = x.Name,
                        Description = x.Description,                        
                        TaskDependencies= context.TaskDependencies
                           .Where(y => y.TaskId == x.Id).ToArray()
                    })
                    .SingleOrDefaultAsync(x => x.Id == _id);  

有人知道这方面的信息吗?关于性能等。

问候

【问题讨论】:

  • 文档参考Include方法。您的两个查询中的 Include 调用是相同的 (.Include(x => x.TaskDependencies)),那么问题到底是什么?
  • 抱歉忘记删除第二个包含,现在更新

标签: c# .net entity-framework-core include dbcontext


【解决方案1】:

两个查询应该具有相同的性能和 SQL。请注意,Include 后跟 Select 会被 EF Core 忽略。

所以,最舒服的查询是:

var task = await context.Tasks                   
    .Select(x => new TaskBaseModel
    {
        Id = x.Id,
        Name = x.Name,
        Description = x.Description,                        
        TaskDependencies = x.TaskDependencies.ToArray()
    })
    .SingleOrDefaultAsync(x => x.Id == _id);

【讨论】:

  • 从什么时候开始忽略包含,然后选择?而且您发布的查询不起作用,因为 TaskDependencies 是一个集合..
  • 你试过了吗?
  • 是的,我试过了
  • 这是 LINQ 翻译器的工作方式,如果它在 lambda 正文中看到对导航属性的引用,它会假设如何重写查询。实际上在重写后它将创建您的第二个示例。它简单的解释,在幕后大量的代码通过导航属性简化了实体的工作。
  • @M.Azyoksul,实际上这是不好的做法。您的 DTO 可能不需要所有属性,但您已经从数据库中加载了所有内容。
猜你喜欢
  • 2021-11-19
  • 2021-07-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多