由于Asp.net WebAPi几乎支持odata,因此我非常喜欢让$ inlinecount工作,以便与kendo ui(或任何其他)一起使用。 因此它以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的基础提供者?
答案 0 :(得分:2)
我上周遇到了确切的问题。查看Extending your ASP.NET Web API responses with useful metadata
我使用这篇文章和示例代码来启动并使用OData运行分页网格。如示例中所详述,我创建了一个委托处理程序来捕获HttpResponseMessage并将其包装在包含项目计数的自定义元数据中。还创建了一个自定义属性CustomQueryableAttribute,它继承了默认的QueryableAttribute。
这听起来有点复杂但实际上很容易实现。我在大约30分钟内完成了一些事情。
希望未来版本的Web API具有更完整的OData支持。
编辑: Odata支持不会附带Web API。正在删除RTM版本的可查询属性。通过单独的Nuget软件包,在最初的重新安装后的某个时间,将提供更完整的OData支持。
答案 1 :(得分:1)
它使用最新的Web API OData包。
答案 2 :(得分:0)
用于实现此功能的SPA DataController
(源自ApiController
)。但是,随着最新的更改,它已被删除,因为他们计划以不同的方式支持OData。
如果您正在使用MVC 4 Beta,那么您只需将控制器更改为DataController
,即可进行设置。如果您正在使用RC,那么您应该查看Codeplex上较旧的ASP.NET Webstack commit。您感兴趣的方法是ExecuteAsync
,来自 DataController.cs