Трудность объединения коллекций с использованием шаблона хранилища с EF4
У меня проблемы с получением правильного дизайна. Я использую шаблон репозитория для управления уровнем данных. В одном из моих контроллеров (MVC3) я создаю запрос LINQ, который должен выполнить соединение. У меня есть 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
Как мне создать вокруг этого? Я читал о функциях, определенных моделями, но я не уверен, что это путь?
заранее спасибо