我可以检索所有数据,但看起来OData无法正常工作 我正在使用EFCore实体框架Web API。 这是我对OData https://www.youtube.com/watch?v=ZCDWUBOJ5FU
的参考下面的更新模型
返回应为
[
{
"name":"FakeHelmet"
},
{
"name":"OriginalHelmet"
},
{
"name":"ClassAHelmet"
}
]
这是我的代码。
控制器:
[HttpGet]
[EnableQuery]
public async Task<IActionResult> Get()
{
var models = await service.Filter();
return Ok(models);
}
服务
public async Task<IEnumerable<HelmetDto>> Filter()
{
var models = repo.GetQueryableTest<Helmet>();
return models.Select(x => SimpleMapper.Map(x, new HelmetDto()));
}
存储库
public virtual IQueryable<TEntity> GetQueryableTest<TEntity>()
where TEntity : class, IEntity
{
IQueryable<TEntity> query = context.Set<TEntity>();
return query;
}
我也在Startup.cs
public void ConfigureServices(IServiceCollection services)
{
services.AddOData();
}
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
app.UseMvc(routeBuilder =>
{
routeBuilder.EnableDependencyInjection();
routeBuilder.
Count().
Filter().
OrderBy().
Expand().
Select().
MaxTop(null);
});
}
这是我的模特
public class Helmet
{
public Helmet()
{
}
public int Id { get; set; }
public String Name { get; set; }
public String Description { get; set; }
public String Type { get; set; }
}
请求为localhost:5002/api/Helmet?$select=name
我创建的OData
无法正常工作。希望得到答案。
这是我对OData https://www.youtube.com/watch?v=ZCDWUBOJ5FU
返回应为
[
{
"name":"FakeHelmet"
},
{
"name":"OriginalHelmet"
},
{
"name":"ClassAHelmet"
}
]
答案 0 :(得分:0)
似乎您没有为OData服务添加路由映射:
方法1:
为您的[Route("api/[controller]")]
添加一个HelmetController
注释
[Route("api/[controller]")]
public partial class HelmetController: ControllerBase
{
}
方法2
配置特定的OData路由:
public void Configure(IApplicationBuilder app, IHostingEnvironment env) { app.UseMvc(routeBuilder => { routeBuilder.MapODataServiceRoute( "odata", "api", GetEdmModel(), new DefaultODataBatchHandler() ); routeBuilder.EnableDependencyInjection(); routeBuilder. Count(). Filter(). OrderBy(). Expand(). Select(). MaxTop(null); routeBuilder.MapRoute( name: "default", template: "{controller=Home}/{action=Index}/{id?}" ); }); }
这将使OData
在以/api
开头的路线上工作。
您可以在GetEdmModel()
方法中设置EDM模型:
private static IEdmModel GetEdmModel()
{
ODataConventionModelBuilder builder = new ODataConventionModelBuilder();
builder.EntitySet<Helmet>("Helmet")
.EntityType.Filter().Count().Expand().OrderBy().Page().Select();
}
请注意,在两种情况下,控制器名称都应为HelmetController
而不是HelmetsController
,因为要将模型名称配置为Helmet
而不是Helmets
。
最后,您可以如下查询Helmet
:
/api/Helmet?$select=name