1

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

由于 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 的底层提供者?

4

3 回答 3

2

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

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

这里听起来可能有点复杂,但实际上实现起来非常简单。我在大约 30 分钟内启动并运行了一些东西。

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

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

于 2012-07-03T21:17:29.937 回答
1

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

它使用最新的 Web API OData 包。

于 2012-08-23T12:38:21.847 回答
0

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

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

于 2012-07-03T08:28:24.647 回答