Предоставить хранилище как IQueryable - PullRequest
2 голосов
/ 14 июля 2010

Я бы хотел представить репозиторий как тип 'IQueryable'.

Хранилище использует Linq для NHibernate для связи с базой данных.

Может кто-нибудь указать мне пример реализации?

Например, как будет выглядеть соответствующая реализация GetEnumerator () в моем хранилище?

Edit:

Было бы что-то подобное уместным?

public class MyTypeRepository : IEnumerable<MyType>
{        
    IEnumerator<MyType> IEnumerable<MyType>.GetEnumerator()
    {
        return Session.Linq<MyType>().GetEnumerator();
    }


    IEnumerator IEnumerable.GetEnumerator()
    {
        return ((IEnumerable<MyType>)this).GetEnumerator();
    }

}

Ответы [ 4 ]

4 голосов
/ 14 июля 2010

Я думаю, что Репозиторий может дать вам 1 или более IQueryables / IEnumerables, но не: Репозиторий равен IQueryable.

Это может выглядеть так:

 public interface IPersonRepository
 {
    IEnumerable<Person> GetAllPersons();
    void AddPerson(Person person);

    // more...
 }

Вы можете вернуть IQeryable<Person> из GetAllPerson (), но это не может быть улучшением. IEnumerable проще, меньше связывает.

4 голосов
/ 14 июля 2010

Это плохой дизайн.

IQueryable - это вопрос (поиск «запрос» в словаре). Это то, как вы запрашиваете данные. Это то, что вы должны отдавать в хранилище.

Репозиторий должен возвращать ответы - сами данные.

Если репозиторий возвращает IQueryable, вы почти полностью отрицаете необходимость в репозитории.

2 голосов
/ 14 июля 2010

Множество мнений об этом, но Айенде (Орен Эйни) , кажется, думает, IQueryable - это нормально , чтобы вернуться и сформулировать свою точку зрения довольно хорошо.

1 голос
/ 14 июля 2010

Просто вернитесь session.Linq<T>()

...