由于 Asp.net WebAPi 几乎支持 odata,它非常吸引我让 $inlinecount 工作,以便它与 kendo ui(或任何其他)很好地配合使用。为了让它以 jsonp 格式返回值,我实现了一个新的 MediaFormatter(来自 Stackoverflow)。
麻烦的是,它需要结果中包含计数元素才能使服务器端分页正常工作,所以现在我破解了格式化程序以使虚假计数正常工作。这一切都很好,网格很高兴,但是获得真正的计数是一个挑战,因为返回的 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 的底层提供者?