Как написать универсальный innerJoin в универсальном репозитории? - PullRequest
1 голос
/ 04 февраля 2012

Я использую общий репозиторий для разработки своего собственного BLL с каркасом сущностей. Универсальный репозиторий Но все универсальные репозитории не имеют внутреннего соединения.Lokk ниже:

 public interface IRepository
{
    IQueryable<T> List<T>() where T : class;
    T Get<T>(int id) where T : class;
    void Create<T>(T entityTOCreate) where T : class;
    void Edit<T>(T entityToEdit) where T : class;
    void Delete<T>(T entityToDelete) where T : class;
}

Как преобразовать вышеуказанный код в:

 public interface IRepository
{
    IQueryable<T> List<T>() where T : class;
    T Get<T>(int id) where T : class;
    void Create<T>(T entityTOCreate) where T : class;
    void Edit<T>(T entityToEdit) where T : class;
    void Delete<T>(T entityToDelete) where T : class;
void InnerJoin<T>(T entityName, TNew entityName2) where T : class, where TNew : class;
}

или я думаю, что мы можем использовать шаблон Fluent interfacve, подобный этому:

    public List<MyWorker> ListByID( int ID)
{
    using (var Ctx = new DomainRepository<Worker>(new ProposalsEntities()))
         return Ctx.Find<Worker>(q => q.ID== ID).ToList().InnerJoin(XEntity,x=>x.ID=q.ID).InnerJoin(YEntity,y=>y.ID=q.ID);
}

Юо может дать еще один совет, чтобы решить этот фантастический вопрос.Как я могу написать выше код соединения в универсальном репозитории?

Ответы [ 2 ]

4 голосов
/ 05 февраля 2012

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

Вы можете исправить свой репозиторий, добавив дополнительный метод:

IQueryable<T> Query<T>() { return dataContext.GetTable<T>(); }

(Этот пример для Linq 2 Sql).

Вы должны быть в состоянии обеспечить вызывающего абонента составным запросом, а не списком.Затем вызывающие абоненты могут написать:

from w in repo.Query<Worker>()
join e in repo.Query<XEntity>() on ...

Если комментарий разрешен: Общий шаблон репозитория не является хорошей идеей.Это мало помогает, но наносит большой ущерб.

Либо напрямую используйте DataContext / EntityContext / Session напрямую, либо используйте специализированные репозитории.

0 голосов
/ 06 января 2018

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

...