c# - 什么是更好/更快或更安全的 .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 还是分别获取实体?
解决方案
在这种情况下,您最好在查询中包含您的Tickets
实体。Projects
当然,您在数据库上投入了更多的工作,但这就是 DB 和JOIN
s 的力量所在。
就目前而言,您正在对数据库进行两次往返,并且您很可能会看到通过在查询中包含子实体来提高性能。
如果不正确使用,您真正遇到的问题.Include()
是获取实体集合,然后遍历这些实体并尝试访问尚未获取的实体的导航属性;臭名昭著的n+1问题。
推荐阅读
- vb.net - 检查按钮是否为默认输入“接受按钮”以绘制更粗的边框
- netty - 如何通过 OpenJDK 1.8.0_252 在 Netty 中使用 ALPN
- react-native - 如何将状态数组上传到 Firestore 中的数组
- firefox - Firefox:中键单击工具栏按钮时出错
- spring-boot - 从 jms 消息侦听器重新启动 flowable 进程
- c++ - 如何在没有高 CPU 使用率的情况下检测 Windows 中的按键?
- python - ValueError: 操作数不能与形状 (100,) (99,) 一起在 Python 中广播错误
- javascript - 如何在每组之间延迟发出特定缓冲区大小的值
- r - 为什么这个闪亮的应用程序可以在 ShinyApps.io 上运行,但不能在 Shiny Server 上运行?
- r - 我如何使用数据框中的值在 ggplot 2 中绘制图形并将它们转换为四舍五入的百分比标签