实体框架核心的表现

时间:2018-03-23 10:13:03

标签: c# linq entity-framework-core

我对EF Core很陌生。我总是使用EF 6.0,从来没有使用过包含。现在问题出现了我应该如何使用这些包括。我想出了三个可能的选择,想知道你更喜欢使用/哪个是最快的?为什么?

在这些样本中,我的目的是获取俱乐部的详细信息。我想检查是否存在具有相应身份证的俱乐部,然后获取所有信息。

选项1:

using (var context = new TrainingSchedulerContext())
{
    var clubs = context.Clubs.Where(c => c.Id == clubId);
    if (clubs.Count() == 0)
        return NotFound();

    var club = clubs.Include(c => c.Memberships)
        .Include(c => c.MembershipRequests)
        .Include(c => c.TrainingTimes)
        .Include(c => c.AdminRoles)
        .SingleOrDefault();
}

选项2:

using (var context = new TrainingSchedulerContext())
{
    var club = context.Clubs.Include(c => c.Memberships)
            .Include(c => c.MembershipRequests)
            .Include(c => c.TrainingTimes)
            .Include(c => c.AdminRoles)
            .SingleOrDefault(c => c.Id == clubId);

    if (club == null)
        return NotFound();
}

选项3:

using (var context = new TrainingSchedulerContext())
{
    var club = context.Clubs.SingleOrDefault(c => c.Id == clubId);
    if (club == null)
        return NotFound();

    club = context.Clubs.Include(c => c.Memberships)
        .Include(c => c.MembershipRequests)
        .Include(c => c.TrainingTimes)
        .Include(c => c.AdminRoles)
        .SingleOrDefault(c => c.Id == clubId);
}

1 个答案:

答案 0 :(得分:2)

让我们从最坏到最好:

  • 选项3 :这显然是最糟糕的。您正在将整个项目下载到内存中,只是为了将其丢弃。这是浪费资源。
  • 选项1 :这不是最好的方法,因为您正在对数据库执行2次查询,一次针对Count,另一次针对SingleOrDefault。第一个是不需要的,因此:
  • 选项2 :这是最好的情况,因为如果该项目不存在,则不会从数据库中下载任何内容,因此您不必担心这一点,并且&# 39; s也是一个数据库调用。