包含() vs 选择() 性能



我有一个父实体,具有指向子实体的导航属性。只要子实体中存在关联的记录,就不能删除父实体。子实体可以包含数十万条记录。

我想知道在实体框架中执行此操作最有效的操作是什么:

var parentRecord = _context.Where(x => x.Id == request.Id)
                           .Include(x => x.ChildTable)
                           .FirstOrDefault();
// check if parentRecord exists
if (parentRecord.ChildTable.Any()) {
  // cannot remove
}

var parentRecord = _context.Where(x => x.Id == request.Id)
                            .Select(x => new {
                                  ParentRecord = x,
                                  HasChildRecords = x.ChildTable.Any()
                            })
                           .FirstOrDefault();
// check if parentRecord exists
if (parentRecord.HasChildRecords) {
  // cannot remove
}

第一个查询可能包含数千条记录,而第二个查询不会,但是第二个查询更复杂。

哪种方法最好?

我会说它很糟糕。这取决于您使用的 DBMS。这取决于优化器的工作效果等。因此,一个带有 JOIN 的语句可能比许多 SELECT 语句快得多。

一般来说,我会说当您需要 Child 表中的行时,请使用 .Include() .否则,不要包括它们。或者简单来说,只需阅读您需要的数据。

答案取决于您的数据库设计。为哪些列编制索引?表中有多少数据?

Include()将工作卸载到 C# 层,但意味着更简单的查询。这里可能是更好的选择,但您应该考虑提取由实体框架生成的 SQL,并通过优化检查运行每个 SQL。

可以将实体框架生成的 sql 输出到可视化工作室控制台,如此处的说明所示。

此示例可能会创建更好的 sql 查询,以满足您的需求。

最新更新