Web API 2.2 OData 控制器支持 class 层次结构
Web API 2.2 OData Controller supporting class hierarchy
我正在尝试创建一个支持转换操作的 ODataController。
假设我们有从 Shape
派生的 Shape class 和 Circle class
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。
如何让我的控制器支持投射?又或者我的做法完全错误,理解错了原理?
谢谢
此示例应该适合您:
假设我有以下模型:
public class Product
{
public int ID { get; set; }
public string Name { get; set; }
}
public class Category:Product
{
public int Price { get; set; }
}
我只需要在 ProductsController
class:
中执行这两个控制器操作
[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/
我正在尝试创建一个支持转换操作的 ODataController。
假设我们有从 Shape
派生的 Shape class 和 Circle classnamespace 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。
如何让我的控制器支持投射?又或者我的做法完全错误,理解错了原理?
谢谢
此示例应该适合您:
假设我有以下模型:
public class Product
{
public int ID { get; set; }
public string Name { get; set; }
}
public class Category:Product
{
public int Price { get; set; }
}
我只需要在 ProductsController
class:
[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/