Трудность объединения коллекций с использованием шаблона репозитория с EF4 - PullRequest
1 голос
/ 25 августа 2011

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

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

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

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

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

1 Ответ

0 голосов
/ 28 февраля 2012

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

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

...