使用asp.net webapi实现oData inlinecount [重复]

Posted

技术标签:

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

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

由于 Asp.net WebAPi 几乎支持 odata,因此让 $inlinecount 工作以使其与 kendo ui(或任何其他)很好地配合对我来说非常诱人。 为了让它以 jsonp 格式返回值,我实现了一个新的 MediaFormatter(来自 ***)。

问题是它需要结果中包含计数元素才能使服务器端分页正常工作,所以现在我破解了格式化程序以使虚假计数正常工作。这一切都很好,网格也很开心,但是获得真正的计数是一个挑战,因为返回的 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 的底层提供者?

【问题讨论】:

【参考方案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 支持。

【讨论】:

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

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

它使用最新的 Web API OData 包。

【讨论】:

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

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

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

【讨论】:

查看类似问题***.com/questions/10706479/…

以上是关于使用asp.net webapi实现oData inlinecount [重复]的主要内容,如果未能解决你的问题,请参考以下文章

ASP .NET MVC 4 WebApi:手动处理 OData 查询

对 DTO 的 ASP.NET WebApi OData 支持

在 ASP.NET Core WebAPI 中获取 OData 计数

如何正确地将 OData 与 ASP.net Core 集成

Asp.Net MVC4 Web API - 我们是不是需要 OData 来构建快速查询服务

使用 OData 的 ASP.Net Core Web API 实现对于单个实体 URI 失败