和 asp.net odata 区别不大. 用法依旧.
定义 EdmModel
public static class ODataConfig { public static IEdmModel GetEdmModel(IServiceProvider servicePrivider) { var builder = new ODataConventionModelBuilder(servicePrivider); /* 对应 route : GET : /odata/products GET : /odata/products(key) POST : /odata/products PUT : /odata/products(key) DELETE : /odata/products(key) */ builder.EntitySet<Product>("Products"); // POST /odata/products/changeSort var productChangeSort = builder.EntityType<Product>().Collection.Action("changeSort"); productChangeSort.Returns<string>(); // POST /odata/products(key)/doSomething var sample1 = builder.EntityType<Product>().Action("doSomething"); sample1.Returns<string>();
// GET /odata/products/getSomething
var sample2 = builder.EntityType<Product>().Collection.Function("getSomething");
sample2.ReturnsCollectionFromEntitySet<Product>("Products");
return builder.GetEdmModel(); } }
普通的 get,post,put,delete 和 RPC get 和 post
然后在 UseMvc 添加上 routing
app.UseMvc(builder => { builder.MapRoute( name: "default", template: "{controller=Home}/{action=Index}/{id?}"); builder.Select().Expand().Filter().OrderBy().MaxTop(null).Count(); builder.MapODataServiceRoute("odata", "odata", ODataConfig.GetEdmModel(app.ApplicationServices)); });
odata 有 default routing 匹配的概念,就好像第一个 code 图的 path 就是 default 的对应.
因为使用的是 default routing 所以不需要添加 [ODataRoute] 标签, 同时也无法使用 [ApiController], 因为 apicontroller 依赖 route 标签...
所以我们必须使用 [FromQuery] [FromBody] binding data.
builder.EntitySet<Product>("Products"); 里头的 "Products" 对应了 "ProductsController"
get,put,post,delete 是通过方法名字的前面几个字来匹配的.
builder.EntityType<Product>().Collection.Action("changeSort") 的 "changeSort" 对应的是 "changeSort" 方法名
如果你使用 ODataRoute 的话,那么就不看方法名字,转而看 ODataRoute 来对应.