使用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 集成