SQL Server如何查询返回嵌套列表适配含List<Symbol>的C# Watchlist模型
解决方案
方案1:SQL层面直接返回嵌套结构(推荐,直接适配你的模型要求)
你可以通过数据库自带的JSON聚合能力,让每个Watchlist仅返回1行,第4列直接存放所有Symbol的集合数据,刚好对应你要求的fields[3]位置。
针对SQL Server数据库
SELECT w.Id, w.Account_id, w.Name, ( SELECT s.symbol AS Ticker, s.exchange AS Exchange, s.name AS Name FROM WatchlistSymbols ws JOIN Symbols s ON s.id = ws.SymbolId WHERE ws.WatchlistId = w.Id FOR JSON PATH ) AS SymbolJson FROM Watchlists w WHERE w.Account_id = @AccountId
查询结果中SymbolJson列是符合结构的JSON数组,你只需要将其反序列化为List<Symbol>类型,传入SetSymbolData方法即可。
针对MySQL数据库
SELECT w.Id, w.Account_id, w.Name, JSON_ARRAYAGG( JSON_OBJECT( 'Ticker', s.symbol, 'Exchange', s.exchange, 'Name', s.name ) ) AS SymbolJson FROM Watchlists w JOIN WatchlistSymbols ws ON w.Id = ws.WatchlistId JOIN Symbols s ON s.id = ws.SymbolId WHERE w.Account_id = @AccountId GROUP BY w.Id, w.Account_id, w.Name
方案2:保留原有SQL,C#层面做分组映射
如果不想修改SQL语句,也可以直接对扁平的查询结果做分组处理,手动构造Watchlist对象:
// 假设flatResults为原SQL查询返回的所有行数据集合 var watchlistList = flatResults .GroupBy(row => new { row.Id, row.Account_id, row.Name }) .Select(g => new Watchlist(new object[] { g.Key.Id, g.Key.Account_id, g.Key.Name, // 严格匹配Symbol构造函数的字段顺序:Ticker/Exchange/Name g.Select(row => new Symbol(new object[] { row.symbol, row.exchange, row.name })).ToList() })) .ToList();
注意:你的Symbol构造函数参数顺序为Ticker(fields[0])、Exchange(fields[1])、Name(fields[2]),映射时不要打乱顺序避免数据赋值错误
内容的提问来源于stack exchange,提问作者laskdjf
相关产品推荐
相关产品推荐

