Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Entity Framework - Performance in count

I've a little question about performance with Entity Framework.

Something like

using (MyContext context = new MyContext())
{
    Document DocObject = context.Document.Find(_id);
    int GroupCount = context.Document.Where(w=>w.Group == DocObject.Group).ToList().Count();
}

takes about 2 seconds in my database (about 30k datasets), while this one

using (MyContext context = new MyContext())
{
    Document DocObject = context.Document.Find(_id);
    int GroupCount = context.Document.Where(w=>w.Group == DocObject.Group).Count();
}

takes 0,02 seconds.

When my filter for 10 documents had 20 seconds to wait, I checked my code, and changed this to not use ToList() before Count().

Any ideas why it needs 2 seconds for this line with the ToList()?

like image 843
Matthias Burger Avatar asked Aug 31 '15 09:08

Matthias Burger


People also ask

How do you count in IQueryable?

Please use the Count() method. IQueryable<People> list = repository. FindAllPeople; int cnt = list. Count();


1 Answers

Calling ToList() then Count() will:

  • execute the whole SELECT FROM WHERE against your database
  • then materialize all the resulting entities as .Net objects
  • create a new List<T> object containing all the results
  • return the result of the Count property of the .Net list you just created

Calling Count() against an IQueryable will:

  • execute SELECT COUNT FROM WHERE against your database
  • return an Int32 with the number of rows

Obviously, if you're only interested in the number of items (not the items themselves), then you shouldn't ever call ToList() first, as it will require a lot of resources for nothing.

like image 188
ken2k Avatar answered Sep 24 '22 05:09

ken2k