我有一个实体项目,然后我有一个实体票,有一个projectId
。在for Details页面之前,我找到了项目
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还是单独获取实体?
在这种情况下,最好将Tickets
实体包含在Projects
查询中。当然,你在数据库上投入了更多的工作,但这就是DB和JOIN
的强大之处。
按照目前的情况,您将对数据库进行两次往返,并且,通过在查询中包含子实体,您很可能会看到性能的提高。
在那里你会真的有麻烦,不使用.Include()
正确地获取实体的集合,然后通过这些实体循环,并试图访问一个导航属性的实体,还没有被获取;著名的n+1问题