Entity Framework:如何让Web API返回期望的JSON响应格式?
解决方案
你需要通过**分组(GroupBy)**重构查询结果结构,将相同ticker的记录聚合到对应的change数组中,同时保证异步执行查询避免线程阻塞。修改后的代码如下:
[HttpGet("{tickers}")] public async Task<ActionResult<IEnumerable<object>>> GetPrice(string tickers) { string[] ticks = tickers.Split(','); var groupedData = await _dbContext.Prices .Where(p => ticks.Contains(p.Ticker)) .GroupBy(p => p.Ticker) // 按股票代码分组 .Select(g => new { Ticker = g.Key, Change = g.Select(item => new { PriceDate = item.PriceDate, ChangePercent = item.ChangePercent }).OrderBy(item => item.PriceDate) // 按日期排序 }) .ToListAsync(); return groupedData.Any() ? Ok(groupedData) : NotFound(); }
关键修改说明:
- 使用
GroupBy(p => p.Ticker)将同一只股票的所有记录聚合为一组 - 对每个分组构造新对象:保留
ticker作为标识,将该股票的所有价格变动数据整理到change数组中 - 在
change数组内仅保留priceDate和changePercent字段,并按日期排序 - 添加
ToListAsync()确保EF Core异步执行查询(原代码未执行异步操作,返回的是未解析的IQueryable) - 调整返回类型为
ActionResult<IEnumerable<object>>,匹配实际返回的集合类型
进阶优化(可选):
如果追求代码规范性和可维护性,建议创建自定义DTO类替代匿名类型:
// 定义DTO类 public class PriceChangeDto { public string Ticker { get; set; } public List<ChangeDetailDto> Change { get; set; } } public class ChangeDetailDto { public DateTime PriceDate { get; set; } public decimal ChangePercent { get; set; } }
然后将查询中的匿名类型替换为DTO:
.Select(g => new PriceChangeDto { Ticker = g.Key, Change = g.Select(item => new ChangeDetailDto { PriceDate = item.PriceDate, ChangePercent = item.ChangePercent }).OrderBy(item => item.PriceDate).ToList() })
内容的提问来源于stack exchange,提问作者shyam yadav
相关产品推荐
相关产品推荐

