简体   繁体   中英

Performance of Entity Framework Core

I'm quite new to the EF Core. I always used the EF 6.0 and never had to use an include. Now the question comes up how i should work with these includes. I figured out three possible options and wanted to know wich would you prefer to use/which is the fastest and why?

In these samples my intention is to get the details of a club. I want to check if a club with the corresponding id exists and then get the whole information.

Option 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();
}

Option 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();
}

Option 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);
}

Let's go from worst to best:

  • Option 3 : this is obviously the worst. You are downloading the entire item into memory just for throwing it away . This is a waste of resources.
  • Option 1 : this is not the best way because you are executing 2 queries against the database, one for Count and another one for SingleOrDefault . The first one is not needed, hence:
  • Option 2 : this is the best case because if the item does not exist, nothing will be downloaded from the database, so you don't have to worry about that, and it's also a single database call.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM