Возвратите количество из службы Netflix oData, Когда LINQ рассчитывают (), Метод не Работает

Существует ли способ использовать выражение LINQ для запроса запроса количества от сервиса Netflix oData в Silverlight 4?

Документация Netflix показывает, что можно возвратить количества путем добавления $count к запросу на набор, но URL как это:

http://netflix.cloudapp.net/Catalog/Genres/$count

Не сгенерирован от выражения как это:

var count = (from g in catalog.Genres select g).Count();

Вышеупомянутый код возвращает ошибку при высказывании, что Метод счета не поддерживается. Существует ли способ сделать это в LINQ, или я должен просто выполнить запрос WebClient для получения значения?

6
задан Craig Shoemaker 13 May 2010 в 17:24
поделиться

2 ответа

Он работает в LinqPad 4 с использованием C # 4.0

var count = (from g in Genres select g).Count();
count.Dump();

Result: 518

В LinqPad 2 с использованием C # 3.0 появляется ошибка.

1
ответ дан 17 December 2019 в 02:25
поделиться

Count и LongCount не поддерживаются в Silverligth, поскольку они требуют синхронного выполнения запроса. Поскольку Silverlight требует, чтобы все сетевые операции выполнялись асинхронно, это невозможно.

Вы можете выполнить соответствующий HTTP-запрос программно, не используя DataServiceContext (или связанные классы), поскольку $ count возвращает текстовое представление числа, разобрать ответ не так сложно.

Или вы можете использовать небольшой трюк. Вы можете использовать IncludeTotalCount (), чтобы добавить параметр запроса $ inlinecount = allpages в запрос, который будет включать счетчик в ответ. Затем, чтобы не загружать все объекты с сервера, вы можете использовать Take (0), который добавит $ top = 0 и, таким образом, вернет пустой набор результатов. Но встроенный счетчик по-прежнему будет содержать правильный номер.

Вы можете получить доступ к встроенному счетчику в свойстве QueryOperationResponse.TotalCount. Примерно так:

    NetflixCatalog ctx = new NetflixCatalog(new Uri("http://netflix.cloudapp.net/Catalog"));
var q = (DataServiceQuery<Genre>)ctx.Genres.IncludeTotalCount().Take(0);
q.BeginExecute((ar) =>
    { 
        QueryOperationResponse<Genre> r = (QueryOperationResponse<Genre>)q.EndExecute(ar);
        r.TotalCount.ToString(); // Use the count in whatever way you need
    }, null);
5
ответ дан 17 December 2019 в 02:25
поделиться
Другие вопросы по тегам:

Похожие вопросы: