Как создать общий репозиторий «глубокое включение»? - PullRequest
1 голос
/ 02 марта 2012

Я создал общий репозиторий с некоторыми методами поверх EF Codefirst, который прекрасно работает. Метод Get выглядит следующим образом (включает один уровень)

public virtual IEnumerable<T> Get(
        Expression<Func<T, bool>> filter = null,
        Func<IQueryable<T>, IOrderedQueryable<T>> orderBy = null,
        string includeProperties = "") 
{

        IQueryable<T> query = _dDbSet;

        if (filter != null)
            query = query.Where(filter);

        query = includeProperties.Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries).Aggregate(query, (current, includeProperty) => current.Include(includeProperty));

        return orderBy != null ? orderBy(query).ToList() : query.ToList();
    }

Но я сталкиваюсь с проблемой, когда мне нужно, чтобы общий репозиторий возвратил «более глубокое» включение

Пример: объект Hotel имеет отношение к списку комнат, а каждая комната имеет отношение к человеку.

Я хочу, чтобы мой метод возвращал объект Hotel со списком комнат с указанием лица этих комнат.

Как я могу решить эту проблему с помощью GenericRepository?

Я не хочу использовать решение:

    var hotel = _hotelRepository.Context.Hotels.Where(p => p.HotelId == HotelId).Include(p => p.RoomList.Select(b => b.Person)).First();

в моем бизнес-классе, потому что я хочу отделить доступ к данным в genericRepository и иметь возможность вычеркнуть метод из моего тестового проекта.

Есть ли хорошее решение для этого, или мне нужно использовать контекст с Select, как упомянуто выше?

Спасибо!

1 Ответ

4 голосов
/ 02 марта 2012

Я чувствую запах Внутренняя платформа .Вы пытаетесь заставить ваш общий репозиторий делать все, что делает EF.Почему бы не использовать EF (или какой-либо другой ORM, который вы используете) напрямую?

Лично я недавно отказался от своих собственных репозиториев.Я инкапсулирую многоразовые запросы, используя ORM непосредственно в классах «report».Для более простых одноразовых запросов я использую ORM напрямую.Когда я пишу классы отчетов или прямые запросы, я знаю, что включать / извлекать и т. Д., И могу использовать инструменты, которые предлагает ORM.

Помните: ваш ORM уже является хранилищем, нет необходимостиоберните его (ИМО).

См. http://ayende.com/blog/3955/repository-is-the-new-singleton

...