C# 如何在WebAPI2中将嵌套列表LINQ转换为JSON?

C# 如何在WebAPI2中将嵌套列表LINQ转换为JSON?,c#,json,linq,asp.net-web-api,C#,Json,Linq,Asp.net Web Api,我正在创建一个返回Json的web api。我的输出如下所示: [ { "NodeID":1252, "CASNumber":"1333-86-4", "EINECSCode":"215-609-9", "EUIndex":"215-609-9", "Duty":"No", "Prohibited":"No", "Unwanted":"No", "IsReach":"No",

我正在创建一个返回Json的web api。我的输出如下所示:

[  
   {  
      "NodeID":1252,
      "CASNumber":"1333-86-4",
      "EINECSCode":"215-609-9",
      "EUIndex":"215-609-9",
      "Duty":"No",
      "Prohibited":"No",
      "Unwanted":"No",
      "IsReach":"No",
      "SubstanceName":"Carbon black",
      "GroupName":"Renault Complete",
      "Portion":0.100000
   },
   {  
      "NodeID":1252,
      "CASNumber":"1333-86-4",
      "EINECSCode":"215-609-9",
      "EUIndex":"215-609-9",
      "Duty":"No",
      "Prohibited":"No",
      "Unwanted":"No",
      "IsReach":"No",
      "SubstanceName":"Carbon black",
      "GroupName":"Renault Orange",
      "Portion":0.100000
   }
]
{  
   "NodeID":1252,
   "CASNumber":"1333-86-4",
   "EINECSCode":"215-609-9",
   "EUIndex":"215-609-9",
   "Duty":"No",
   "Prohibited":"No",
   "Unwanted":"No",
   "IsReach":"No",
   "SubstanceName":"Carbon black",
   "GroupName":[  
      {  
         "name":"Renault Complete"
      },
      {  
         "name":"Renault Orange"
      }
   ],
   "Portion":0.100000
}
我正在尝试使用以下ouptut创建嵌套Json:

[  
   {  
      "NodeID":1252,
      "CASNumber":"1333-86-4",
      "EINECSCode":"215-609-9",
      "EUIndex":"215-609-9",
      "Duty":"No",
      "Prohibited":"No",
      "Unwanted":"No",
      "IsReach":"No",
      "SubstanceName":"Carbon black",
      "GroupName":"Renault Complete",
      "Portion":0.100000
   },
   {  
      "NodeID":1252,
      "CASNumber":"1333-86-4",
      "EINECSCode":"215-609-9",
      "EUIndex":"215-609-9",
      "Duty":"No",
      "Prohibited":"No",
      "Unwanted":"No",
      "IsReach":"No",
      "SubstanceName":"Carbon black",
      "GroupName":"Renault Orange",
      "Portion":0.100000
   }
]
{  
   "NodeID":1252,
   "CASNumber":"1333-86-4",
   "EINECSCode":"215-609-9",
   "EUIndex":"215-609-9",
   "Duty":"No",
   "Prohibited":"No",
   "Unwanted":"No",
   "IsReach":"No",
   "SubstanceName":"Carbon black",
   "GroupName":[  
      {  
         "name":"Renault Complete"
      },
      {  
         "name":"Renault Orange"
      }
   ],
   "Portion":0.100000
}
这是我的班级:

public class BasicSubstances
{
    public int NodeID { get; set; }
    public string CASNumber { get; set; }
    public string EINECSCode { get; set; }
    public string EUIndex { get; set; }
    public string Duty { get; set; }
    public string Prohibited { get; set; }
    public string Unwanted { get; set; }
    public string IsReach { get; set; }
    public string SubstanceName { get; set; }
    public string GroupName { get; set; }
    public decimal ?Portion { get; set; }
}
这是我的控制器:

public List<BasicSubstances> GetBasicSubstance(string partNumber,  string version, int nodeID, int parentID )
{
    IMDSDataContext dc = new IMDSDataContext();
    List<BasicSubstances> results = new List<BasicSubstances>();

    foreach (spGetBasicSubstanceResult part in dc.spGetBasicSubstance( partNumber, version, nodeID, parentID))
    {
        results.Add(new BasicSubstances()
            {
                NodeID = part.NodeID,
                CASNumber = part.CASNumber,
                EINECSCode = part.EINECSCode,
                EUIndex = part.EINECSCode,
                Duty = part.Duty,
                Prohibited = part.Prohibited,
                Unwanted = part.Unwanted,
                IsReach = part.ISReach,
                SubstanceName = part.SynonymName,
                GroupName = part.GroupName,
                Portion = part.Portion

            });

    }
    return results;
}
公共列表GetBasicSubstance(字符串零件号、字符串版本、int-nodeID、int-parentID) { IMDSDataContext dc=新的IMDSDataContext(); 列表结果=新列表(); foreach(dc.spGetBasicSubstance中的spGetBasicSubstanceResult部件(部件号、版本、节点ID、父ID)) { 结果.添加(新的基本物质() { NodeID=part.NodeID, CASNumber=零件号CASNumber, EINECSCode=part.EINECSCode, EUIndex=part.eineCode, 责任, 禁止的,禁止的, 不需要的,不需要的, IsRach=part.isRach, SubstanceName=part.SynonymName, GroupName=part.GroupName, 部分 }); } 返回结果; } 我的Json看起来像第一个输出,我需要它看起来像第二个输出。
我完全迷路了,任何帮助都将不胜感激。

好吧,您可以尝试以下方法:

您的型号:

public class BasicSubstanceViewModel 
{
    public int NodeID { get; set; }
    public string CASNumber { get; set; }
    public string EINECSCode { get; set; }
    public string EUIndex { get; set; }
    public string Duty { get; set; }
    public string Prohibited { get; set; }
    public string Unwanted { get; set; }
    public string IsReach { get; set; }
    public string SubstanceName { get; set; }
    public List<GroupName> GroupName { get; set; }
    public decimal ?Portion { get; set; }
}

public class GroupName
{
    public string Name { get; set; }
}
public BasicSubstanceViewModel GetBasicSubstance(string partNumber,  string version, int nodeID, int parentID )
{
    IMDSDataContext dc = new IMDSDataContext();
    var spResult = dc.spGetBasicSubstance( partNumber, version, nodeID, parentID).ToList();

    if(!spResult.Any())
    {
        return null;
    }

    var firstPart = spResult[0];

    var result = new BasicSubstanceViewModel
    {
        NodeID = firstPart.NodeID,
        CASNumber = firstPart.CASNumber,
        EINECSCode = firstPart.EINECSCode,
        EUIndex = firstPart.EINECSCode,
        Duty = firstPart.Duty,
        Prohibited = firstPart.Prohibited,
        Unwanted = firstPart.Unwanted,
        IsReach = firstPart.ISReach,
        SubstanceName = firstPart.SynonymName,
        GroupName = spResult.Select(p => new GroupName { Name = p.GroupName }).ToList(),
        Portion = firstPart.Portion
    };

    return result;
}

希望能有所帮助。

好吧,您可以尝试以下方法:

您的型号:

public class BasicSubstanceViewModel 
{
    public int NodeID { get; set; }
    public string CASNumber { get; set; }
    public string EINECSCode { get; set; }
    public string EUIndex { get; set; }
    public string Duty { get; set; }
    public string Prohibited { get; set; }
    public string Unwanted { get; set; }
    public string IsReach { get; set; }
    public string SubstanceName { get; set; }
    public List<GroupName> GroupName { get; set; }
    public decimal ?Portion { get; set; }
}

public class GroupName
{
    public string Name { get; set; }
}
public BasicSubstanceViewModel GetBasicSubstance(string partNumber,  string version, int nodeID, int parentID )
{
    IMDSDataContext dc = new IMDSDataContext();
    var spResult = dc.spGetBasicSubstance( partNumber, version, nodeID, parentID).ToList();

    if(!spResult.Any())
    {
        return null;
    }

    var firstPart = spResult[0];

    var result = new BasicSubstanceViewModel
    {
        NodeID = firstPart.NodeID,
        CASNumber = firstPart.CASNumber,
        EINECSCode = firstPart.EINECSCode,
        EUIndex = firstPart.EINECSCode,
        Duty = firstPart.Duty,
        Prohibited = firstPart.Prohibited,
        Unwanted = firstPart.Unwanted,
        IsReach = firstPart.ISReach,
        SubstanceName = firstPart.SynonymName,
        GroupName = spResult.Select(p => new GroupName { Name = p.GroupName }).ToList(),
        Portion = firstPart.Portion
    };

    return result;
}

希望能有所帮助。

如何确保除
GroupName
之外的所有属性都具有相同的值?它们将始终具有相同的值。在我的存储过程中,它只有一条记录,我加入了一个表以获得组名的多个列表。组名的类型应该是
公共列表组名{get;set;}
?不能使用字符串创建json数组。您需要在这里执行一些操作
GroupName=part.GroupName,
如何确保除
GroupName
之外的所有属性都具有相同的值?它们始终具有相同的值。在我的存储过程中,它只有一条记录,我加入了一个表以获得组名的多个列表。组名的类型应该是
公共列表组名{get;set;}
?不能使用字符串创建json数组。您需要在这里执行一些操作
GroupName=part.GroupName,
var firstPart=spResult[0];引发错误:错误14无法将带[]的索引应用于类型为“System.Data.Linq.ISingleResult”的表达式的完美工作,需要在:party=firstPart.party};后加分号;。它不允许我编辑。谢谢我漏掉了一个细节,我希望你愿意帮助我。原来我还需要将SubstanceName嵌套。当我修改代码以适应这种情况时。我得到了SubstanceName和GroupName的副本。您只需修改
ViewModel
,以容纳更多的集合。您甚至可以使用相同的嵌套模型/类;引发错误:错误14无法将带[]的索引应用于类型为“System.Data.Linq.ISingleResult”的表达式的完美工作,需要在:party=firstPart.party};后加分号;。它不允许我编辑。谢谢我漏掉了一个细节,我希望你愿意帮助我。原来我还需要将SubstanceName嵌套。当我修改代码以适应这种情况时。我得到了SubstanceName和GroupName的副本。您只需修改
ViewModel
,以容纳更多的集合。您甚至可以使用相同的嵌套模型/类。我这样做了,但现在我得到了重复的值。