Производительность шаблона хранилища и IQueryable <T> - PullRequest
4 голосов
/ 19 апреля 2011

Понятия не имею, правильно ли я это делаю, но вот как выглядит метод Get в моем хранилище:

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

Допустим, у меня также есть GeographyRepository, в котором есть GetCountries метод, который похож на это.

У меня есть 2 отдельных класса уровня обслуживания, вызывающих эти 2 отдельных репозитория, совместно использующих один и тот же DbContext (код EF 4.1 в первую очередь).контроллер, я бы сделал:

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

Это 2 отдельных вызова базы данных.Если бы я не использовал эти шаблоны и связал интерфейс и базу данных, у меня был бы 1 звонок.Я предполагаю, что это что-то вроде производительности по сравнению с ремонтопригодностью.

Мой вопрос: можно ли это перевести на 1 вызов базы данных?Можем ли мы объединить такие запросы, когда views вызывают несколько репозиториев?

1 Ответ

5 голосов
/ 19 апреля 2011

Я бы сказал, что если производительность является реальной проблемой, то я бы постарался вообще не возвращаться к базе данных.Я предполагаю, что список, возвращаемый из geoService.GetCountries (), довольно статичен, поэтому я был бы склонен кешировать его в сервисе после начальной загрузки и вообще удалить попадание в базу данных.Тот факт, что у вас есть служба, говорит о том, что это было бы идеальным местом для отвода таких деталей.

Обычно, когда вы задаете вопросы о производительности, редко можно разрешить все проблемы, связанные с перфорированием, одной и той же кистью ивам нужно проанализировать каждую ситуацию и найти подходящее решение для конкретной проблемы, с которой вы столкнулись.

...