支持类层次的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.
如何使我的控制器支持类型转换?或者我的方法完全错了,我误解了原则?
谢谢!
这个示例应该适合您:
假设我有以下模型:
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/