2012-02-14 7 views
1

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

Этот метод работает (когда я просматриваю к 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.

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

+4

Что такое "HTTP 12152 error"? – Gabe

+0

ERROR_WINHTTP_INVALID_SERVER_RESPONSE 12152 Ответ сервера не может быть проанализирован. - Начиная с Windows Server 2003 и Windows XP с пакетом обновления 2, максимальный объем данных заголовка WinHTTP принимает в ответе HTTP по умолчанию 64K. Если HTTP-ответ сервера содержит более 64 Кбайт общих данных заголовка, WinHTTP выдает запрос с ошибкой ERROR_WINHTTP_INVALID_SERVER_RESPONSE. – dtb

+1

Почему вы выполняете свое подразделение перед выполнением запроса? Это не выглядит правильным для меня. – CodesInChaos

ответ

3

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

+0

Perfecto. Ну, на первый взгляд, так или иначе :) Я избавился от ненужных 'using' и' ToList() ', и теперь служба работает так, как ожидалось. SQLProfiler показывает, что выполняется отсроченное выполнение, т. Е. Он выполняет '$ top = 1' вместо того, чтобы потянуть всю таблицу. – Merenzo

Смежные вопросы