支持类层次的Web API 2.2 OData控制器

本文关键字:OData 控制器 API Web 层次 支持 | 更新日期: 2023-09-27 17:50:38

我正在尝试创建一个支持cast动作的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错误

参考路由约定,我必须创建这样的操作

[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.

如何使我的控制器支持类型转换?或者我的方法完全错了,我误解了原则?

谢谢!

支持类层次的Web API 2.2 OData控制器

这个示例应该适合您:

假设我有以下模型:

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

我解决了这个问题。问题不在控制器上,而是在我发出请求的方式上。所以,只有在请求的最后加上/才能正常工作,就像这样

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