.NET Core OData如何配置EDM忽略泛型包装类额外属性?
解决OData仅返回ResponseList中Data集合的方案
方案一:直接返回Data集合(推荐)
这种方式最直接,让OData直接处理业务实体集合,完全规避包装类的额外属性。
配置EDM模型
在EDM构建方法中,直接注册你的业务实体ReturnItems为实体集,而非包装类ResponseList<T>:public IEdmModel GetEdmModel() { var builder = new ODataConventionModelBuilder(); // 注册ReturnItems实体集,名称可自定义 builder.EntitySet<ReturnItems>("ReturnItems"); return builder.GetEdmModel(); }修改控制器返回逻辑
调整接口方法,从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属性:
配置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(); }控制器返回包装类
控制器仍返回ResponseList<ReturnItems>,但OData序列化时会自动忽略ExtraInfo,最终返回结构为{"Data": [/* ReturnItems数组 */]}。
内容的提问来源于stack exchange,提问作者Tom
相关产品推荐
相关产品推荐

