C# 格式化api JSON响应以向数组添加属性

C# 格式化api JSON响应以向数组添加属性,c#,linq,asp.net-core,entity-framework-core,C#,Linq,Asp.net Core,Entity Framework Core,我有以下api控制器,它返回您在此处看到的查询的json表示形式: public async Task<ActionResult<IEnumerable<CarDto>>> GetCarData(Guid carID) { var carData = await (from cl in _context.CarList join tl in _context.transmissionList

我有以下api控制器,它返回您在此处看到的查询的json表示形式:

public async Task<ActionResult<IEnumerable<CarDto>>> GetCarData(Guid carID)
{
    var carData = await (from cl in _context.CarList
                         join tl in _context.transmissionList
                             on cl.CId equals tl.CId
                         join to in _context.transmissionOptions
                             on tl.TId equals to.TId
                         where cl.CId == carID
                         select new CarDto
                         {
                             CarId = cl.CarId,
                             TransmissionId = tl.TId,
                             OptionId = to.OptionId,
                             GearId = to.GearId
                         })
                         .ToListAsync();
    return carData;
}
不过,我希望对其进行格式化,以便有一个名为transmissionChoices的属性,该属性包含一个可能选项的数组

像这样:

{
    "carId": "351a",
    "transmissionId": "ec7",
    "transmissionChoices": [
        {
            "optionId": "a1",
            "gearId": "674532a"
        },
        {
            "optionId": "b7",
            "gearId": "5f9173f"
        },
        {
            "optionId": "c5",
            "gearId": "cf807"
        }
    ]
}

有没有办法让控制器这样格式化?

您可以使用LINQ GroupBy方法,然后将分组结果投影到所需的形状中

公共异步任务GetCarData(Guid carID) { var carData=await(来自上下文中的cl.CarList 在_context.transmissionList中加入tl 关于cl.CId等于tl.CId 加入到上下文中。传输选项 在tl.TId上等于.TId 其中cl.CId==carID 选择新的 { CarId=cl.CarId, TransmissionId=tl.TId, OptionId=to.OptionId, GearId=to.GearId }) .GroupBy(x=>x.CarId) .选择(g=>new { CarId=g.First().CarId, TransmissionId=g.First().TransmissionId, 变速器选择=g.选择(x=>新 { OptionId=x.OptionId, GearId=x.GearId }) }) .ToListAsync(); 返回carData; }
请注意,这是将结果投影到匿名类型中。您可以随意创建一个与所需模式匹配的模型,然后在
选择(…)
投影中使用该模型。

您好,谢谢!那么这需要两种型号吗?我原来的一张,CarDto,还有一张新的?还是最好将两者结合起来?再次感谢!这取决于你。没有真正的理由为第一个投影定义一个模型,因为您的API没有公开该类型。我可能只是将
卡片的形状更改为
类,以匹配预期的输出。您可能需要为
{optionId;gearId;}
的嵌套集合添加一个
TransmissionChoiceDto
或其他内容。
{
    "carId": "351a",
    "transmissionId": "ec7",
    "transmissionChoices": [
        {
            "optionId": "a1",
            "gearId": "674532a"
        },
        {
            "optionId": "b7",
            "gearId": "5f9173f"
        },
        {
            "optionId": "c5",
            "gearId": "cf807"
        }
    ]
}