Возможный дубликат:
Разбиение на страницы OData с помощью WebApi ( $inlinecount )< /а>
Поскольку Asp.net WebAPi почти поддерживает odata, мне очень заманчиво заставить $inlinecount работать, чтобы он хорошо работал с пользовательским интерфейсом кендо (или любым другим). Чтобы он возвращал значение в формате jsonp, я реализовал новый MediaFormatter (из Stackoverflow).
Проблема в том, что в результатах должен быть элемент count, чтобы заставить работать пейджинг на стороне сервера, поэтому на данный момент я взломал форматтер, чтобы заставить работать фальшивый счетчик. Все это отлично работает, и сетка полностью удовлетворена, однако получение реального количества является проблемой, поскольку возвращаемое выражение IQueryable уже имеет примененные к нему фильтры/Take и т. д.
public override Task WriteToStreamAsync(Type type, object value, Stream stream, HttpContentHeaders contentHeaders, TransportContext transportContext)
{
string callback;
if (IsJsonpCountableRequest(out callback))
{
return Task.Factory.StartNew(() =>
{
var q = value as IQueryable<Movie>;
var count = q.Count(); // this count doesnt return the actual count
var writer = new StreamWriter(stream);
writer.Write(callback + "({");
writer.Write(@"""d""");
writer.Write(" : { ");
writer.Write(@"""results""");
writer.Write(" : ");
writer.Flush();
base.WriteToStreamAsync(type, value, stream, contentHeaders, transportContext).Wait();
writer.Write(",");
writer.Write(@"""__count""");
writer.Write(" : ");
writer.Write(string.Format(@"""{0}""", count));
writer.Write("}");
writer.Write("})");
writer.Flush();
});
}
else
{
return base.WriteToStreamAsync(type, value, stream, contentHeaders, transportContext);
}
}
Есть ли способ получить счетчик отдельно, может быть, от основного поставщика IQueryable?