如何使用C#WebAPI .NET Core实体框架修复Odata

时间:2019-09-11 02:38:37

标签: c# entity-framework-core odata asp.net-core-webapi

我可以检索所有数据,但看起来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"
    }
]

1 个答案:

答案 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