Трудность объединения коллекций с использованием шаблона хранилища с EF4

У меня проблемы с получением правильного дизайна. Я использую шаблон репозитория для управления уровнем данных. В одном из моих контроллеров (MVC3) я создаю запрос LINQ, который должен выполнить соединение. У меня есть 2 вопроса по этому поводу:

  1. Лучше ли добавить метод в мой репозиторий для выполнения всех объединений, проекций и т. Д.? Я немного сомневаюсь по этому поводу, потому что это приведет к постоянно растущему определению контракта в моем хранилище?
  2. Допустим, у меня есть метод List() в репозитории Post, который возвращает все элементы. В настоящее время я не могу использовать этот метод в запросе linq (join), потому что он не может преобразовать его в выражение хранилища. Обратите внимание, что в приведенном ниже коде используется класс с именем repo, который содержит ссылку на все мои репозитории (сообщения, друзья), использующие один и тот же экземпляр контекста.

БОЛЬШОЕ РЕДАКТИРОВАНИЕ: Сейчас все немного яснее, но я надеюсь, что кто-нибудь сюда заскочит и поможет мне все организовать;-). То, что я хочу сделать, это реализовать шаблон спецификации вместе с моим шаблоном хранилища. Проблема в том, что я использую POCO, а мои репозитории используют интерфейс IContext, который использует IObjectSets. Таким образом, в методе списка ниже, Posts - это IObjectSet, а Context - это интерфейс IContext, в который я вставляю свой фактический контекст.

Я читал, и есть очень хороший готовый к использованию код, например, реализация-репозитория-шаблона-с-ef4-poco-support и реализация-репозитория-шаблона-с-сущностью-каркасом.

Оба эти примера используют objectContext в хранилище. Не лучше ли абстрагироваться от этого?

Мой репозиторий:

public System.Linq.IQueryable<Post> List()
{
    return this.context.Posts;
}

И в моем методе контроллера:

var friendquestions = (from q in base._repo.Post.List().OfType<Question>()
                       from f in _repo.Friends.List()
                       where f.userId == myid
                       where q.Author == f.friendId
                       select q.Id).ToArray();

Следующее работает, однако (почему?):

var temp = (from q in base._repo.Post.List().OfType<Question>()
            where q.Id > 6
            select q.Id).ToArray();

Это в основном та же проблема, что и здесь: linq-to-entity-does-not -озна-the-method

Как мне создать вокруг этого? Я читал о функциях, определенных моделями, но я не уверен, что это путь?

заранее спасибо

1 ответ

Не лучше ли абстрагироваться от этого?

Ответ: Вы можете посмотреть - NCommon of Ritesh Рао. Он был использован IEFSession для переноса ObjectContext.

Другие вопросы по тегам