.NET 5 Web API中Breeze OData查询结果嵌套容器问题求解
Breeze + OData带select查询返回嵌套容器的修复方案
问题根源
你的AddNewtonsoftJson配置中,Breeze默认序列化设置与OData的响应处理逻辑冲突,导致带select的查询结果被嵌套在容器对象中。
修改配置方案
1. 调整NewtonsoftJson配置,兼容OData
修改ConfigureServices中的代码,在保留Breeze核心序列化设置的同时,添加OData响应格式的兼容配置:
services.AddControllers() .AddOData(opt => { // 按需配置OData功能,示例: opt.Select().Filter().OrderBy().SetMaxTop(100); opt.AddRouteComponents("api/breeze", BuildEdmModel()); // 替换为你的EDM模型构建方法 }) .AddNewtonsoftJson(opt => { var ss = JsonSerializationFns.UpdateWithDefaults(opt.SerializerSettings); if (ss.ContractResolver is DefaultContractResolver resolver) { resolver.NamingStrategy = null; // 保留原命名配置 } ss.Formatting = Newtonsoft.Json.Formatting.Indented; // 关键:禁用OData的响应包装,直接返回集合/实体 ss.ContractResolver = new DefaultContractResolver { NamingStrategy = null }; // 确保OData集合不被包装在value属性中 opt.SerializerSettings.Converters.Add(new ODataUnwrapConverter()); });
2. 自定义转换器处理OData集合
如果上述配置仍未解决,添加自定义转换器跳过容器包装:
public class ODataUnwrapConverter : JsonConverter { public override bool CanConvert(Type objectType) { return typeof(IEnumerable).IsAssignableFrom(objectType) && !objectType.IsArray; } public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) { throw new NotImplementedException(); } public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) { // 直接序列化集合,不添加容器包装 serializer.Serialize(writer, value as IEnumerable); } }
3. 确保配置顺序
必须让AddOData在AddNewtonsoftJson之前调用,保证OData配置优先生效,避免序列化逻辑冲突。
内容的提问来源于stack exchange,提问作者Dharv
相关产品推荐
相关产品推荐

