You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.NET Core OData如何配置EDM忽略泛型包装类额外属性?

解决OData仅返回ResponseList中Data集合的方案

方案一:直接返回Data集合(推荐)

这种方式最直接,让OData直接处理业务实体集合,完全规避包装类的额外属性。

  1. 配置EDM模型
    在EDM构建方法中,直接注册你的业务实体ReturnItems为实体集,而非包装类ResponseList<T>:

    public IEdmModel GetEdmModel()
    {
        var builder = new ODataConventionModelBuilder();
        // 注册ReturnItems实体集,名称可自定义
        builder.EntitySet<ReturnItems>("ReturnItems");
        return builder.GetEdmModel();
    }
    
  2. 修改控制器返回逻辑
    调整接口方法,从ResponseList<ReturnItems>中提取Data属性作为返回值,同时保留[EnableQuery]特性以支持OData查询:

    [EnableQuery]
    public IActionResult Get()
    {
        // 原业务逻辑获取包装类实例
        var response = _yourBusinessService.GetData();
        // 直接返回Data集合
        return Ok(response.Data);
    }
    

    这样OData会直接返回IEnumerable<ReturnItems>的数组结构,完全不包含ExtraInfo。

方案二:保留包装类结构但忽略ExtraInfo

如果因业务限制必须返回ResponseList<T>结构,可通过EDM配置隐藏ExtraInfo属性:

  1. 配置EDM模型
    在构建EDM时,注册ResponseList<ReturnItems>并忽略ExtraInfo:

    public IEdmModel GetEdmModel()
    {
        var builder = new ODataConventionModelBuilder();
        // 注册ResponseList<ReturnItems>实体类型
        var responseType = builder.EntityType<ResponseList<ReturnItems>>();
        // 忽略ExtraInfo属性
        responseType.Ignore(r => r.ExtraInfo);
        // 标记Data为集合属性
        responseType.CollectionProperty(r => r.Data);
        // 注册对应的实体集
        builder.EntitySet<ResponseList<ReturnItems>>("ReturnItems");
        return builder.GetEdmModel();
    }
    
  2. 控制器返回包装类
    控制器仍返回ResponseList<ReturnItems>,但OData序列化时会自动忽略ExtraInfo,最终返回结构为{"Data": [/* ReturnItems数组 */]}。


内容的提问来源于stack exchange,提问作者Tom

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 16:07:46