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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 22:30:49