C# 格式化api JSON响应以向数组添加属性
我有以下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
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"
}
]
}