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

如何将SQL视图的平面查询结果序列化为嵌套结构的OData复杂对象

解决方案

方案1:使用EF Core自有实体类型(推荐,无需修改现有视图)

你可以通过EF Core的Owned Entity(自有实体)特性实现字段嵌套,无需拆分现有视图,仅需调整实体结构和OData配置即可:

  1. 定义嵌套的ProductInfo类
// 无需加Table等特性,作为自有实体使用
public class ProductInfo
{
    public string ProductDescription { get; set; }
    public string color { get; set; }
    public string image { get; set; }
}
  1. 修改原有Product实体结构
[Table("V_Products")]
public class Product
{
    [Key]
    public int Id { get; set; }
    public string ProductName { get; set; }
    // 嵌套的自有实体属性
    public ProductInfo ProductInfo { get; set; }
}

由于你现有视图的列名和ProductInfo的属性名完全匹配,EF Core会自动完成字段映射,无需额外配置。如果列名不匹配,仅需在ProductInfo的对应属性上添加[Column("视图中实际列名")]特性指定映射关系即可。

  1. OData配置添加自动展开规则
    在OData的Edm模型构建逻辑中,将ProductInfo设置为自动展开的复杂属性:
var modelBuilder = new ODataConventionModelBuilder();
var productEntity = modelBuilder.EntityType<Product>();
// 配置ProductInfo为复杂属性
productEntity.ComplexProperty(p => p.ProductInfo);
// 配置自动展开,无需客户端传递$expand参数即可返回嵌套结构
productEntity.Property(p => p.ProductInfo).IsAutoExpand();
modelBuilder.EntitySet<Product>("Products");

配置完成后,原有查询逻辑完全不需要修改,OData返回的结构就会和你预期的一致。

方案2:使用DTO投影

如果你不想修改原有数据实体,可以通过DTO(数据传输对象)+ 映射的方式实现结构调整:

  1. 定义符合返回结构的DTO类
public class ProductDto
{
    public int Id { get; set; }
    public string ProductName { get; set; }
    public ProductInfoDto ProductInfo { get; set; }
}

public class ProductInfoDto
{
    public string ProductDescription { get; set; }
    public string color { get; set; }
    public string image { get; set; }
}
  1. 配置映射规则(以AutoMapper为例)
CreateMap<Product, ProductDto>()
    .ForMember(dest => dest.ProductInfo, opt => opt.MapFrom(src => new ProductInfoDto
    {
        ProductDescription = src.ProductDescription,
        color = src.color,
        image = src.image
    }));
  1. OData接口返回DTO
    在控制器查询时直接投影到DTO类型:
[EnableQuery]
public IActionResult Get()
{
    return Ok(_dbContext.Products.ProjectTo<ProductDto>(_mapper.ConfigurationProvider));
}

同时将OData的Edm模型调整为基于ProductDto构建即可。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 22:39:04