使用asp.net webapi实现oData inlinecount

可能重复:
使用WebApi进行OData分页($ inlinecount)

由于Asp.net WebAPi几乎支持odata,因此我非常喜欢让$ inlinecount工作,以便它与kendo ui(或任何其他)很好地协作。 因此它以jsonp格式返回值,我实现了一个新的MediaFormatter(来自Stackoverflow)。

麻烦的是它需要结果才能在其中包含count元素以使服务器端分页工作,所以现在我攻击了格式化程序以获得虚假计数。 这一切都很好,并且网格都很开心,但是真正的计数是一个挑战,因为返回的IQueryable表达式已经应用了filter/ 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; 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的基础提供者?

尝试这种方法: http : //www.strathweb.com/2012/08/supporting-odata-inlinecount-with-the-new-web-api-odata-preview-package/

它使用最新的Web API OData包。

我上周遇到了确切的问题。 查看使用有用的元数据扩展ASP.NET Web API响应

我使用这篇文章和示例代码来启动并使用OData运行分页网格。 如示例中所详述,我创建了一个委托处理程序来捕获HttpResponseMessage并将其包装在包含项目计数的自定义元数据中。 还创建了一个自定义属性CustomQueryableAttribute,它inheritance了默认的QueryableAttribute。

这听起来有点复杂但实际上很容易实现。 我在大约30分钟内完成了一些任务。

希望Web API的未来版本具有更完整的OData支持。

编辑: Odata支持不会随Web API一起提供。 正在删除RTM版本的可查询属性。 通过单独的Nuget软件包,在初始密切后的某个时间,将提供更完整的OData支持。

SPA DataController (派生自ApiController )用于实现此function。 但是,随着最新的更改,它已被删除,因为他们计划以不同的方式支持OData。

如果您正在使用MVC 4 Beta,那么您只需将控制器更改为DataController ,即可进行设置。 如果您正在使用RC,那么您应该查看Codeplex上较旧的ASP.NET Webstack 提交 。 您感兴趣的方法是来自DataController.cs的 ExecuteAsync