.Net WebApi OData返回Queryable的操作

我希望实现接近RateProduct操作的内容: http : //www.asp.net/web-api/overview/odata-support-in-aspnet-web-api/odata-actions

在该教程中,它被定义为:

[HttpPost] public int RateProduct([FromODataUri] int key, ODataActionParameters parameters) { // ... } ODataModelBuilder modelBuilder = new ODataConventionModelBuilder(); modelBuilder.EntitySet("Products"); // New Code ActionConfiguration rateProduct = modelBuilder.Entity().Action("RateProduct"); rateProduct.Parameter("Rating"); rateProduct.Returns(); 

但是,我有一个Location实体的用例,它足够聪明,可以返回其周围某个半径范围内的其他位置。 它大致应该是这样的:

 [HttpPost] public IQueryable GetLocationsWithinRadius([FromODataUri] int key, ODataActionParameters parameters) { // Get the Location instance intended to be the center of the radius by using the key // Do a radius search around it using (int)parameters["radius"] as the radius // return the IQueryable of all location found within that radius } ODataModelBuilder modelBuilder = new ODataConventionModelBuilder(); modelBuilder.EntitySet("Locations"); // New Code ActionConfiguration getLocations = modelBuilder.Entity().Action("GetLocationsWithinRadius"); getLocations.Parameter("radius"); getLocations.Returns<IQueryable>(); 

我很乐意让这个工作,当返回类型是IQueryable时,它当前不起作用。 如果返回类型是一个类似int的原语,那么它可以工作,否则当我在fiddler中创建一个post时会出现以下错误(该post类似于http://localhost:2663/odata/Locations(2112)/GetLocationsWithinRadius并且请求正文是{radius: 50} ):

 { "odata.error":{ "code":"","message":{ "lang":"en-US","value":"An error has occurred." },"innererror":{ "message":"The 'ObjectContent`1' type failed to serialize the response body for content type 'application/json; odata=minimalmetadata; streaming=true; charset=utf-8'.","type":"System.InvalidOperationException","stacktrace":"","internalexception":{ "message":"The related entity set could not be found from the OData path. The related entity set is required to serialize the payload.","type":"System.Runtime.Serialization.SerializationException","stacktrace":" at System.Web.Http.OData.Formatter.Serialization.ODataFeedSerializer.WriteObject(Object graph, ODataMessageWriter messageWriter, ODataSerializerContext writeContext)\r\n at System.Web.Http.OData.Formatter.ODataMediaTypeFormatter.c__DisplayClassa.b__9()\r\n at System.Threading.Tasks.TaskHelpers.RunSynchronously(Action action, CancellationToken token)" } } } } 

是否有可能做我想要完成的事情? 如果是的话,我敢问,返回的IQueryable是否可以与odata paramaters组合……(那会很好)?

谢谢

看起来您的操作配置不正确。 尝试以下操作,看看它是否有效:

 //getLocations.Returns>(); getLocations.ReturnsCollectionFromEntitySet("Locations");