【问题标题】:implementing oData inlinecount using asp.net webapi [duplicate]使用asp.net webapi实现oData inlinecount [重复]
【发布时间】:2012-07-03 06:29:08
【问题描述】:

可能重复:
OData pagination with WebApi ( $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 的底层提供者?

【问题讨论】:

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


    【解决方案1】:

    上周我遇到了确切的问题。查看Extending your ASP.NET Web API responses with useful metadata

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

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

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

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

    【讨论】:

    • 你有没有机会把这个答案转移到我引用为 dup 和 VTCing 的 Q 上(假设你同意这一点),我会在那里投票吗? (如果你不同意我可以删除评论)
    • 帖子移至帖子移至stackoverflow.com/questions/10706479
    • 谢谢,这是一个更快乐的整理狂!
    【解决方案2】:

    【讨论】:

    • 你有没有机会把这个答案转移到我引用为 dup 和 VTCing 的 Q 上(假设你同意这一点),我会在那里投票吗? (如果你不同意我可以删除评论)
    • 感谢您的举动 - 这是一个更快乐的整洁怪胎!
    【解决方案3】:

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

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

    【讨论】:

    猜你喜欢
    • 2012-05-29
    • 2013-03-23
    • 2016-04-23
    • 2013-05-11
    • 2013-03-25
    • 2013-03-03
    • 2013-08-28
    • 1970-01-01
    • 2013-02-03
    相关资源
    最近更新 更多