LINQ中select new如何返回包含List<MarketDataEvent>集合的ViewResult对象
你当前返回平铺数据的核心原因是没有对PortfolioName进行分组聚合,只需增加分组操作即可得到期望的结构,以下是两种可行写法:
写法一:EF Core可转译的数据库端分组写法
这种写法会将分组逻辑转换为SQL在数据库侧执行,适合大数据量场景:
var portfolioresult = (from port in _context.Portfolio join u in _context.Universe on port.CUSIP equals u.ID_CUSIP join m in _context.MarketDataEvent on u.ID_CUSIP equals m.CUSIP_NUMBER_REALTIME group m by port.Name into g select new ViewResult() { MarketDataEvents = g.ToList(), PortfolioName = g.Key }) .ToList();
写法二:内存分组写法
如果遇到EF Core无法转译分组逻辑的情况,可以先查询全量关联数据,再在内存中分组,适合数据量较小的场景:
// 第一步查询所有关联的平铺数据 var rawRelationData = (from port in _context.Portfolio join u in _context.Universe on port.CUSIP equals u.ID_CUSIP join m in _context.MarketDataEvent on u.ID_CUSIP equals m.CUSIP_NUMBER_REALTIME select new { MarketEvent = m, PortName = port.Name }) .ToList(); // 第二步在内存中按组合名称分组聚合 var portfolioresult = rawRelationData .GroupBy(item => item.PortName) .Select(group => new ViewResult { PortfolioName = group.Key, MarketDataEvents = group.Select(item => item.MarketEvent).ToList() }) .ToList();
注意事项
请确认你的ViewResult类定义符合要求,避免属性类型不匹配报错:
public class ViewResult { // 泛型参数是MarketDataEvent,不要多写末尾的s public List<MarketDataEvent> MarketDataEvents { get; set; } public string PortfolioName { get; set; } }
内容的提问来源于stack exchange,提问作者user2107843
相关产品推荐
相关产品推荐

