Возвращает счетчик из службы Netflix oData, когда метод LINQ Count () не работает - PullRequest
6 голосов
/ 13 мая 2010

Есть ли способ использовать выражение LINQ для запроса запроса Count из службы odata Netflix в Silverlight 4?

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

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

Не генерируется из выражения, подобного этому:

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

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

Ответы [ 2 ]

5 голосов
/ 11 июня 2010

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);
1 голос
/ 13 мая 2010

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

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

Result: 518

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

...