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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 18:03:04