user4189129
user4189129

Reputation:

Trying to figure out when queries in Entity Framework are executed

This is my first time working with Entity Framework (EF) and I'm trying to learn what exactly executes a query on my database and what doesn't.

This is the code I'm working with. Don't mind the functionality, it isn't important for this question.

using (var db = new Context())
{
    //Check if any reviews have been given.
    if (combinedReviews.Any())
    {
        var restaurantsReviewedIds = combinedReviews.Select(rev => rev.RestaurantId);

        //(1)
        ratedRestaurants = db.Restaurants.Where(rest => restaurantsReviewedIds.Contains(rest.Id))
            .DistinctBy(rest => rest.Id)
            .ToList();
    }

    //(2)
    var restsClose = db.Restaurants.Where(rest => db.Reviews.Any(rev => rev.RestaurantId == rest.Id))
        .OrderBy(rest => rest.Location.Distance(algorithmParams.Location))
        .Take(algorithmParams.AmountOfRecommendations);

    //(3)
    tempList = ratedRestaurants.Union(restsClose).ToList();
    var tempListIds = tempList.Select(rest => rest.Id); //Temporary list.

    //(4)
    restsWithAverage = db.Reviews.Where(rev => tempListIds.Contains(rev.RestaurantId))
        .GroupBy(rev => rev.RestaurantId)
        .ToList();
}

I have marked each piece of code with numbers, so I'll refer to them with that. Below is what I think is what happens.

  1. This executes a query since I'm calling .ToList() here.

  2. This returns an IQueryable, so this won't execute a query against the database.

  3. This executes the query from (2).

  4. This executes another query since I'm calling .ToList().

How close to the truth am I? Is all of this correct? If this doesn't make sense, could you give an example what executes a query and what doesn't?

I'm sorry for asking so many questions in one question, but I thought I wouldn't need to create so many questions since all of this is about a single topic.

Upvotes: 3

Views: 1516

Answers (2)

Jorn Theunissen
Jorn Theunissen

Reputation: 191

Linq query execution is different per query. I recommend reading the following page: https://msdn.microsoft.com/en-us/library/bb738633(v=vs.110).aspx

Upvotes: 0

Sebastian Siemens
Sebastian Siemens

Reputation: 2421

If you don't want to execute a query you can use AsEnumerable.

ToList vs AsEnumerable

ToList – converts an IEnumerable<T> to a List<T>. The advantage of using AsEnumerable vs. ToList is that AsEnumerable does not execute the query. AsEnumerable preserves deferred execution and does not build an often useless intermediate list.

On the other hand, when forced execution of a LINQ query is desired, ToList can be a way to do that.

You could also force execution by putting a For Each loop immediately after the query expression, but by calling ToList or ToArray you cache all the data in a single collection object.

ToLookup and ToDictionary also executing the queries.

Here you can find a list of operators and if they are executing query: https://msdn.microsoft.com/en-us/library/mt693095.aspx.

Upvotes: 5

Related Questions