使用 DTO 问题的 OData v4 自定义路由

本文关键字:v4 自定义 路由 OData DTO 问题 使用 | 更新日期: 2023-09-27 17:57:08

我已经从EF 6模型设置了一个OData v4控制器。 使用生成的代码时一切正常。

对于将在下拉列表中引用的某些对象,我想限制发送的数据,以便 DTO 似乎是最佳方法。 所以我现在有一个控制器,它可以与普通对象一起工作,但是一旦我在自定义路由上使用 DTO,我就会遇到麻烦。

我使用了下面的代码,它正确地生成了 DTO 集合,但是当它返回数据时,我最终在客户端上以 406 不可接受状态。

关于出了什么问题的任何建议?

作为旁注,我想要提供一个完整和减少对象的策略是最好的方法(就标准而言)吗?

    // GET: odata/AMO_GeneralStateTypes(5)/AMO_GeneralStates_Basic
    [EnableQuery]
    [Route("odata/AMO_GeneralStateTypes({key})/AMO_GeneralStates_Basic")]
    public IQueryable<AMO_GeneralStatesDTO> GetAMO_GeneralStates_Basic([FromODataUri] int key)
    {
        return db.AMO_GeneralStateTypes
            .Where(m => m.StateTypeId == key)
            .SelectMany(m => m.AMO_GeneralStates.Select(n => new AMO_GeneralStatesDTO()
            {
                StateId = n.StateId,
                StateGuid = n.StateGuid,
                ParentStateId = n.ParentStateId,
                State = n.State,
                TypeId = n.TypeId,
                SortOrder = n.SortOrder,
                Enabled = n.Enabled
            }));
    }

使用 DTO 问题的 OData v4 自定义路由

对于 406 不可接受,请确保在最终的 Edm 模型中定义了返回类型。也就是说,AMO_GeneralStatesDTO 是 Edm 模型可以序列化的类型。

顺便说一句,对于Web API OData,

[Route("odata/AMO_GeneralStateTypes({key})/AMO_GeneralStates_Basic")]

应该是

[ODataRoute("odata/AMO_GeneralStateTypes({key})/AMO_GeneralStates_Basic")]

我在 dto 的 odata webapi 中遇到了一些这样的问题这是我的解决方案:您需要为 OData 注册您的实体类型,否则会出现 406 错误

    ODataConventionModelBuilder builder = new ODataConventionModelBuilder();
    builder.EntityType<YourDTOType>();

希望对您有所帮助