Служба IQueryable WebAPI: зачем мне вызывать .ToList ()? - PullRequest
1 голос
/ 14 февраля 2012

Я унаследовал этот код от разработчика, который ушел на прошлой неделе. Его код основан на статье:
"Restful WCF / EF POCO / UnitOfWork / Repository / MEF" .

Этот метод работает (когда я просматриваю http://myapp/myservice/Returns):

[WebGet(UriTemplate = "Returns")]
public IQueryable<ReturnSnapshot> GetReturnSnapshots()
{
    using (UnitOfWork)
    {
        ReturnSnapshotsRepository.EnrolInUnitOfWork(UnitOfWork);
        return ReturnSnapshotsRepository.FindAll().ToList().AsQueryable();
    }
}

но не будет ли ToList() причиной извлечения всей таблицы из хранилища? У нас будет 500K + строк в производстве.

Я думал, что смогу изменить последнюю строку на это:

return ReturnSnapshotsRepository.FindAll();

как FindAll возвращает IQueryable. Однако мое изменение нарушает работу службы, которая теперь завершается с ошибкой HTTP 12152.

Что мне делать?

Ответы [ 2 ]

3 голосов
/ 14 февраля 2012

Вы должны иметь возможность вернуть IQueryable<T> из службы REST WCF Web API.Я подозреваю, что использование блока вызывает вашу проблему, потому что UnitOfWork удаляется, как только вы вернетесь из этого метода, но до того, как будет выполнен фактический запрос к базе данных.Добавление ToList() решает эту проблему, но, как вы указали, делает это, сначала загружая все в память, поэтому это не идеально.

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

Я не верю, что это может быть разоблачено по WCF, это может объяснить дальше

Предоставление IQueryable поверх службы WCF

...