Web API 2.2 OData Controller支持类层次结构

时间:2015-05-24 19:24:33

标签: c# odata asp.net-web-api2

我正在尝试创建一个支持转换操作的ODataController。

假设我们有Shape类和Circle类派生自Shape

namespace NS
{
    public abstract class Shape {    
       int Id; 
       int X;
       int Y; 
     }

     public class Circle : Shape {    
        int Radius;
     }
}

我想创建控制器ShapesController。

public class ShapesController: ODataController
    {
        ShapesContext db = new ShapesContext();

        [EnableQuery]
        public IQueryable<Shape> Get()
        {
            return db.Shapes;
        }
        [EnableQuery]
        public SingleResult<Shape> Get([FromODataUri] int key)
        {
            IQueryable<Shapes> result = db.Shapes.Where(p => p.Id == key);
            return SingleResult.Create(result);
        }
}

对于像

这样的请求,一切正常
/odata/Shapes
/odata/Shapes(1)

但请求

/odata/Shapes(1)/NS.Circle

导致404错误

参考路由惯例http://www.asp.net/web-api/overview/odata-support-in-aspnet-web-api/odata-routing-conventions我必须创建类似

的行动
[EnableQuery]
public SingleResult<Circle> GetCircle([FromODataUri] int key)
{
     IQueryable<Shapes> result = db.Shapes.Where(p => p.Id == key).Cast<Circle >;
     return SingleResult.Create(result);
}

但它没有帮助 - 404.

如何让我的控制器支持投射?或许我的做法完全错了,我误解了这些原则?

由于

2 个答案:

答案 0 :(得分:0)

此示例应该适合您:

假设我有以下型号:

public class Product
{
    public int ID { get; set; }
    public string Name { get; set; }
}

public class Category:Product
{
    public int Price { get; set; }
}

我只需要在ProductsController类中执行这两个控制器操作:

[EnableQuery]
public IHttpActionResult GetProduct([FromODataUri] int key)
{
    return Ok(Proxy.Products.FirstOrDefault(c => c.ID == key));
}

[EnableQuery]
public IHttpActionResult GetCategory([FromODataUri] int key)
{
    return Ok(Proxy.Products.FirstOrDefault(c => c.ID == key));
}

两者

Products(2)/ODataV4Service.Models.Category

Products(2)

将分别支持正确的上下文URL。

答案 1 :(得分:0)

我解决了这个问题。它不是在控制器中,它是我提出要求的方式。 所以,一切都工作正常,只有当我把它放在最后,就像那样

/odata/Shapes(1)/NS.Circle/