首页 > 解决方案 > 什么是更好/更快或更安全的 .Include() 或分别获取实体?

问题描述

我有一个实体项目,然后我有一个实体票,它有一个projectId. 在详细信息页面之前,我找到了该项目

public async Task<Project> FindByIdAsync(int id)
        {
            return await _db.Projects
                .Include(p => p.ApplicationUsers)
                .FirstOrDefaultAsync(p => p.Id == id);
        }

然后我找到票projectId

public async Task<ICollection<Ticket>> GetAllTicketsForProject(int projectId)
        {
            return await _db.Tickets
                .Where(t => t.ProjectId == projectId)
                .Include(t => t.AssignedUser)
                .Include(t=>t.Project)
                .OrderBy(t=> t.DateCreated)
                .ToListAsync();
        }

删除票证时,我发现了级联删除,我可以制作

public IList<Comment> Comments { get; set; } = new List<Comment>();

现在我可以在查询中包含所有评论。那对我来说是新鲜事。现在我想知道什么是更好的做法?要在查询中使用 Include 还是分别获取实体?

标签: c#entity-framework

解决方案


在这种情况下,您最好在查询中包含您的Tickets实体。Projects当然,您在数据库上投入了更多的工作,但这就是 DB 和JOINs 的力量所在。

就目前而言,您正在对数据库进行两次往返,并且您很可能会看到通过在查询中包含子实体来提高性能。

如果不正确使用,您真正遇到的问题.Include()是获取实体集合,然后遍历这些实体并尝试访问尚未获取的实体的导航属性;臭名昭著的n+1问题


推荐阅读