使用asp.net webapi实现oData inlinecount

时间:2012-07-02 20:11:12

标签: c# jsonp odata asp.net-web-api

  

可能重复:
  OData pagination with WebApi ( $inlinecount )

由于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的基础提供者?

3 个答案:

答案 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)

答案 2 :(得分:0)

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

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