【问题标题】:How to fix Odata with C# WebAPI .NET Core Entity Framework如何使用 C# WebAPI .NET Core Entity Framework 修复 Odata
【发布时间】:2023-03-12 04:35:01
【问题描述】:

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

【问题讨论】:

  • 请提供您的头盔型号
  • @metal 查看上面的更新代码

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


【解决方案1】:

您似乎没有为 OData 服务添加路由映射:

方法一:

为您的HelmetController 添加[Route("api/[controller]")] 注释

[Route("api/[controller]")]
public partial class HelmetController: ControllerBase
{

}

方法 2

配置特定的 OData 路由:

公共无效配置(IApplicationBuilder 应用程序,IHostingEnvironment env) { app.UseMvc(routeBuilder => { routeBuilder.MapODataServiceRoute( “数据”, “API”, GetEdmModel(), 新的 DefaultODataBatchHandler() ); routeBuilder.EnableDependencyInjection(); 路由生成器。 数数()。 筛选()。 按顺序()。 扩张()。 选择()。 最大顶部(空); routeBuilder.MapRoute( 名称:“默认”, 模板:“{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

【讨论】:

  • @DanilIshutin 但这对我来说很好用。访问/api/Helmet?$select=name会得到什么?
  • private static IEdmModel GetEdmModel() { ODataConventionModelBuilder builder = new ODataConventionModelBuilder(); builder.EntitySet&lt;Helmet&gt;("Helmet") .EntityType.Filter().Count().Expand().OrderBy().Page().Select(); } 这个需要退货
  • routeBuilder.MapODataServiceRoute( "odata", "api", GetEdmModel(), new DefaultODataBatchHandler() ); 这个也是错误的。我在 new DefaultODataBatchHandler() 中有一条红线
  • @DanilIshutin 1. 请为GetEdmModel() 方法添加return builder.GetEdmModel();。对不起,我没有提到这一点。 2. 忘记加using Microsoft.AspNet.OData.Batch;了吗?
  • @DanilIshutin return builder.GetEdmModel();
猜你喜欢
  • 1970-01-01
  • 2022-01-18
  • 1970-01-01
  • 2021-03-10
  • 1970-01-01
  • 1970-01-01
  • 2017-10-04
  • 1970-01-01
  • 2019-01-25
相关资源
最近更新 更多