【问题标题】:How to create Json Response with append child object to each it's parent object如何通过将子对象附加到每个父对象来创建 Json 响应
【发布时间】:2018-12-14 03:27:48
【问题描述】:
 Table1:    [Building]([ID] [uniqueidentifier] NOT NULL,
            [BuildingCode] [varchar](50) NULL,
            [Name] [varchar](max) NULL,
            [RoleID] [uniqueidentifier] NOT NULL,  )

二表子表设计是这样的

  Table2: [Role](
        [RoleID] [uniqueidentifier] NOT NULL,
        [Name] [varchar](max) NULL)

现在,我想要的回应是这样的:

BuildingCode1
            {
               RoleId:16C6BEA4-421A-4718-8B85-090FC2FD8BCF
               Name:Role Name 1
            },
BuildingCode2  
            {
               RoleId:2HJ44A4-621A-A718-8B85-P90FC2FD8BCF
               Name:Role Name 2
            },
BuildingCode3  
            {
               RoleId:KJL34J8-621A-A718-8B85-3FH39DKF48
               Name:Role Name 3
            }

对于表 1 中的每个建筑代码,从表 2(角色)中获取相关的角色详细信息。请帮助我怎样才能得到这种回应。提前致谢 为此,我创建了 2 个类

  public class BCode_Role
        {
            public RoleTable[] BuildingCode { get; set; }
            public byte Status { get; set; }
        }

     public class RoleTable
        { 
            public Guid RoleID { get; set; }
            public string Name { get; set; }
        }

返回json的方法是

public Bcode_Role BuldingDetail()
    {
        var result = new BuildingCode_Role();
        var dbBuildingCods = _context.Building.Select(x => x.Code);
        var dbRoles = _context.Role;
        var apiModels = dbRoles.Select(x => new RoleTable {RoleID= x.ID, Name = x.Name }).ToArray();
        result.BuildingCode = apiModels;
        return result;
    }

形成这个我得到这个 Json 输出

{
    "buildingCode": [
        {
            "roleID": "0f752579-57cc-4266-a4b4-4759af97525e",
            "name": "Role 2"
        },
        {
            "roleID": "1914a479-cb75-48b9-b5c3-6792acfba7b3",
            "name": "Role 1"
        },
        {
            "roleID": "3bc21132-079d-4ab9-b9f5-fe2428a281f1",
            "name": "Role 3"
        }
    ],
    "status": 0
}

但其实我想要

{
       "buildingCode1": {
            "roleID": "0f752579-57cc-4266-a4b4-4759af97525e",
            "name": "Role 2"
                        },
     "buildingCode"2: {
            "roleID": "1914a479-cb75-48b9-b5c3-6792acfba7b3",
            "name": "Role 1"
                      },
      "buildingCode"3:  {
            "roleID": "3bc21132-079d-4ab9-b9f5-fe2428a281f1",
            "name": "Role 3"
                       },
    }

【问题讨论】:

    标签: asp.net-mvc entity-framework linq web asp.net-web-api2


    【解决方案1】:

    为了实现这一点,我建议你改变你的 BCode_Role 类如下

    public class BCode_Role
    {
        [JsonProperty("buildingCode")]
        [JsonExtensionData]
        public IDictionary<string,object> BuildingCode{get;set;}
        public byte Status { get; set; }
    }
    
    public class RoleTable
    { 
        [JsonProperty("roleID")]
        public Guid RoleID { get; set; }
        [JsonProperty("name")]
        public string Name { get; set; }
    }
    

    然后在你的 BuldingDetail 方法中,

    public Bcode_Role BuldingDetail()
    {
        var result = new BuildingCode_Role();
        var dbBuildingCods = _context.Building.Select(x => x.Code);
        var dbRoles = _context.Role;
        var apiModels = dbRoles.Select(x => x).AsEnumerable().Select((x,index) => new {Key = $"{nameof(BCode_Role1.BuildingCode)}{index}", Value = (object)new RoleTable {RoleID= x.ID, Name = x.Name }}).ToDictionary(x=>x.Key,y=>y.Value);
        result.BuildingCode = apiModels;
        return result;
    }
    

    序列化结果会给出

    {
      "Status": 0,
      "BuildingCode0": {
        "roleID": "0f752579-57cc-4266-a4b4-4759af97525e",
        "name": "Role 2"
      },
      "BuildingCode1": {
        "roleID": "1914a479-cb75-48b9-b5c3-6792acfba7b3",
        "name": "Role 1"
      },
      "BuildingCode2": {
        "roleID": "3bc21132-079d-4ab9-b9f5-fe2428a281f1",
        "name": "Role 3"
      }
    }
    

    【讨论】:

    • 感谢 anu Viswan 提供的这些有用的东西。
    • 感谢 anu Viswan 提供的这些有用的东西。我实现了您的代码,但我遇到了类似这样的错误... System.NotSupportedException HResult=0x80131515 Message=Could not parse expression 'value(1[LearnWebApi.Model.Role]).Select((x, index) =&gt; new &lt;&gt;f__AnonymousType12(Key = Format("{0}{1}", "BuildingCode" , Convert(index, Object)), Value = Convert(new RoleTable() {RoleID = x.ID, Name = x.Name}, Object)))': 方法 'System.Linq.Queryable.Select 的重载' 目前不支持我该怎么办...?请帮助它会很有帮助
    • @vivekpatel 我怀疑这可能是由于 EF 不支持带索引的选择重载。我已通过将其转换为 AsEnumerable 来更新答案。请您再检查一下吗
    • 实际上我认为我没有发布更具描述性的帖子,因为从 Table1 的每一行:Bulding Code('BuildingCode0','BuildingCode2') 我正在寻找各自的角色 id 详细信息(roleid,名称)来自表 2(角色表)。记录的结果数将是表 1 中的行数。我希望我能够描述它。因为我的英语不好:) 提前致谢 :) 请对此提出建议
    • 请帮我怎么办
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-19
    相关资源
    最近更新 更多