Include()vs Select()性能

时间:2018-02-01 12:37:48

标签: c# entity-framework

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

我想知道实体框架中最有效的做法是:

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
}

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

这是最好的方法吗?

2 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

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

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

您可以将实体框架生成的sql输出到visual studio控制台,如注释here

This example可能会创建一个更符合您需求的更好的SQL查询。

相关问题