Shawn Mclean
Shawn Mclean

Reputation: 57469

Performance of repository pattern and IQueryable<T>

I have no idea if I'm doing this right, but this is how a Get method in my repository looks:

    public IQueryable<User> GetUsers(IEnumerable<Expression<Func<User, object>>> eagerLoading)
    {
        IQueryable<User> query = db.Users.AsNoTracking();

        if (eagerLoading != null)
        {
            foreach (var expression in eagerLoading)
            {
                query = query.Include(expression);
            }
        }            
        return query;
    }

Lets say I also have a GeographyRepository that has GetCountries method, which is similar to this.

I have 2 separate service layer classes calling these 2 separate repositories, sharing the same DbContext (EF 4.1 code-first).

So in my controller, I'd do:

myViewModel.User = userService.GetUserById(1);
myViewModel.Countries = geoService.GetCountries();

This is 2 separate calls to the database. If I didn't use these patterns and tie up the interface and database, I'd have 1 call. I guess its something of a performance vs maintainability.

My question is, can this be pushed to 1 database call? Can we merge queries like this when views calls multiple repositories?

Upvotes: 4

Views: 1112

Answers (1)

lomaxx
lomaxx

Reputation: 115813

I'd say that if performance is the real issue then I'd try and avoid going back to the database altogether. I'm assuming the list returned from geoService.GetCountries() is fairly static, so I'd be inclined to cache it in the service after the initial load and remove the database hit altogether. The fact that you have a service there suggests that it would be the perfect place to abstract away such details.

Generally when asking questions about performance, it's rare that all perf related issues can be tarred with the same brush and you need to analyse each situation and work out an appropriate solution for the specific perf issue you're having.

Upvotes: 5

Related Questions