Как сохранить преимущества IQueryable <T>при использовании ViewModels или DTO вместо сущностей, созданных ORM? - PullRequest
2 голосов
/ 28 июня 2011

При использовании Linq-To-SQL или Entity Framework DataContext и сгенерированные объекты предоставляют интерфейсы IQueryable для отложенного выполнения.Это позволяет мне писать код, подобный этому:

public class RPO
{
    DataContext dc;
    public RPO(){ dc = new DataContext(); }
    public IQueryable<Data> ReadData()
    {
        return dc.Data;
    }
}

public class Svc
{
    RPO repository;
    public Svc() { repository = new RPO(): }
    public IQueryable<Data> ReadActiveData() 
    { 
        return repository.ReadData().Where(d => d.IsActive.Equals(true)); 
    }
    public IQueryable<Data> ReadArchiveData() 
    { 
        return repository.ReadData().Where(d => d.IsArchived.Equals(true)); 
    }
}

Эта модель падает, если в классе Svc я возвращаю DataModel вместо Data - как я могу держать IQueryable<T> как можно ниже?цепь как можно?

Ответы [ 2 ]

3 голосов
/ 28 июня 2011

Ваш слой SVC никогда не должен предоставлять IQueryable. Затем происходит то, что на самом деле ваш потребитель услуг выполняет ваш запрос, что является плохой схемой. Так что сервис всегда должен выставляться данные, достаточные для работы пользователя (отображения).

Предпочтительно IList или IEnumarable.

1 голос
/ 28 июня 2011

Нет, если ваш DTO или ViewModel также не реализуют IQueryable. Как только вы превратите результаты во что-то, что не IQueryable, вот и все.

Я знаю, что это плохой шаблон, но если вам нужно то, что IQueryable делает на этом уровне вашего кода, тогда вам следует просто передать его вместо преобразования перед этим уровнем.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...