2012-07-02 47 views
1

可能重复:
OData pagination with WebApi ($inlinecount)实施的OData inlinecount使用asp.net的WebAPI

由于Asp.net的WebAPI几乎支持OData的,它很诱人,我得到$ inlinecount工作,所以它与kendo ui(或任何其他)搭配很好。 因此,它返回JSONP格式值,我实现了一个新的MediaFormatter(从#1)。

麻烦的是,它需要的结果,具有计数元素在其中,以获得服务器端分页的工作,所以现在我砍死格式化得到一个假的计数工作。这一切都很好,并且网格都很开心,但是由于返回的IQueryable表达式已经应用了filters/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的潜在供应商?

回答

0

的SPA DataController(其从ApiController得到)用于实现此功能。然而,随着最新的变化,它已被删除,因为他们计划以不同的方式支持OData。

如果你用MVC 4测试版的工作,那么你就可以在你的控制器简单地更改为DataController,和你设置。如果您使用的是RC,那么您应该查看Codeplex上较旧的ASP.NET Webstack commit。你感兴趣的方法是ExecuteAsync,从DataController.cs

+0

看到类似的问题http://stackoverflow.com/questions/10706479/odata-pagination-with-webapi-inlinecount –

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支持。

+0

请参阅[其他答案](http://stackoverflow.com/a/12091786/11635) –

+0

在移动这个答案QI你的任何机会,引为DUP和VTCing(假设您同意的),我会给予好评在那里?(如果你不同意我可以删除评论) –

+0

后移动到后移动到http://stackoverflow.com/questions/10706479 – Mark