c# linq-to-sql EF 查询以匹配特定的 JSON 结构

标签 c# asp.net json entity-framework linq

我有以下结构的 JSON:

[

  {

    "ID": 1,

    "Label": "Reg Scheme",

    "Colours": [

      {

        "ID": 1,

        "Value": "0x3333cc",

        "Result": 1,

        "Label": null

      },

      {

        "ID": 2,

        "Value": "0x666699",

        "Result": 2,

        "Label": null

      },

      {

        "ID": 3,

        "Value": "0x009966",

        "Result": 3,

        "Label": null

      }

    ]

  },

  {

    "ID": 2,

    "Label": "Spesh Scheme",

    "Colours": [

      {

        "ID": 11,

        "Value": "0x59699c",

        "Result": 1,

        "Label": null

      },

      {

        "ID": 12,

        "Value": "0x0070ff",

        "Result": 2,

        "Label": null

      },

      {

        "ID": 13,

        "Value": "0x90865e",

        "Result": 3,

        "Label": null

      }

    ]

  },

我有一个实体数据集,我在其中加入了所有相关信息,并尝试通过单个 linq-to-sql EF 查询生成具有该结构的 JSON 以返回到 webapi 方法。

到目前为止我的查询是:

return
    DbContext.Schemes
            .Join(
                DbContext.SchemeColours,
                s => s.SchemeID,
                sc => sc.SchemeID,
                (s, sc) => new
                    {
                        s.SchemeID,
                        s.Label,
                        sc.Colour,
                        sc.Result,
                        sc.ColourID
                    })
            .Select(a =>
                    new Overlay.ReportColourScheme
                        {
                            ID = a.SchemeID,
                            Label = a.Label,
                            Colours = new List<Overlay.ReportColour>
                                {
                                    new Overlay.ReportColour
                                        {
                                            ID = a.ColourID,
                                            Value = a.Colour,
                                            Result = a.Result
                                        }
                                }
                        })
            .ToArray();

几乎是这样,但还不完全是:

[

  {

    "ID": 1,

    "Label": "Regular Scheme",

    "Colours": [

      {

        "ID": 1,

        "Value": "0x3333cc",

        "Result": 1,

        "Label": null

      }

    ]

  },

  {

    "ID": 1,

    "Label": "Regular Scheme",

    "Colours": [

      {

        "ID": 2,

        "Value": "0x666699",

        "Result": 2,

        "Label": null

      }

    ]

  },

  {

    "ID": 1,

    "Label": "Regular Scheme",

    "Colours": [

      {

        "ID": 3,

        "Value": "0x009966",

        "Result": 3,

        "Label": null

      }

    ]

  },

  {

    "ID": 2,

    "Label": "Protanopia adjusted Scheme",

    "Colours": [

      {

        "ID": 11,

        "Value": "0x59699c",

        "Result": 1,

        "Label": null

      }

    ]

  },

  {

    "ID": 2,

    "Label": "Protanopia adjusted Scheme",

    "Colours": [

      {

        "ID": 12,

        "Value": "0x0070ff",

        "Result": 2,

        "Label": null

      }

    ]

  },

  {

    "ID": 2,

    "Label": "Protanopia adjusted Scheme",

    "Colours": [

      {

        "ID": 13,

        "Value": "0x90865e",

        "Result": 3,

        "Label": null

      }

    ]

  },

当然,它会为每个 resultID 创建一个新列表。顶级 ID 是一个 SchemeID——我正在寻找的逻辑如下:“使用特定的 schemeID 获取前 3 个结果,将它们添加到 Colours 列表中,然后转到下一个 schemeID”

我相信这会产生与我开始发布时使用的相同的 JSON。

如有任何帮助,我们将不胜感激,谢谢。

最佳答案

试试下面的代码:

return
    DbContext.Schemes
            .Join(
                DbContext.SchemeColours,
                s => s.SchemeID,
                sc => sc.SchemeID,
                (s, sc) => new
                    {
                        s.SchemeID,
                        s.Label,
                        sc.Colour,
                        sc.Result,
                        sc.ColourID
                    })
            // After joining you group by SchemeID, in this way you have 
            // for each SchemeID the group of related items
            .GroupBy(a => a.SchemeID)
            // You then create your result, starting from the main object
            .Select(g =>
                    new Overlay.ReportColourScheme
                        {
                            ID = g.Key,
                            // I suppose you have at least a child for each SchemeID, 
                            // otherwise you can check if the list is empty
                            Label = g.FirstOrDefault().Label,
                            // For each group you create a list of child object
                            Colours = g.Select(v => new Overlay.ReportColour
                                        {
                                            ID = v.ColourID,
                                            Value = v.Colour,
                                            Result = v.Result
                                        }).ToList()
                        })
            .ToArray();

关于c# linq-to-sql EF 查询以匹配特定的 JSON 结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39899847/

相关文章:

c# - 脚手架 EntityFramework 6 无法将类型为 'System.Data.Entity.Core.Objects.ObjectContext' 的对象转换为 'System.Data.Objects.ObjectContext'

c# - DocFX 离线文档

c# - 在 WPF 中打开新窗口引发异常

php - 是否有任何可能的方法从 PHP Web 应用程序中按顺序获取 JSON

javascript - 如何向 javascript fetch() 函数发送附加数据

c# - Datagrid 更改单元格值(如果是默认值(日期时间))

javascript - jQuery - ASPX 安全库

c# - 提交后如何在后面的代码中重置RadAsyncUpload?

asp.net - IIS7 集成与经典管道 - 使用更多 ASP.NET 线程?

jquery - 通过使用 jQuery $.ajax 从 JSONBin.io 加载数据