【问题标题】:Get Child and Parent property values from class with nested arrays using LINQ使用 LINQ 从具有嵌套数组的类中获取子属性值和父属性值
【发布时间】:2021-12-19 14:37:07
【问题描述】:

所以又是一个 linq 问题。

有没有办法通过 linq 只知道嵌套最深的子属性的值来提取子属性值和父属性值?

要扩展我的问题,这就是我想要做的:

我有这个,但作为一个更大的版本。虽然基本的格式结构可以在这里理解。我将对象反序列化为 c# 类:

{
  "id": "ProductCatalogId1",
  "name": "Product Catalog 1",
  "result": {
    "productFamily": [
      {
        "id": "FamilyId1",
        "name": "Family 1",
        "productCategory": [
          {
            "id": "CategoryId1",
            "name": "Category 1",
            "productConstruction": [
              {
                "id": "ConstructionId1",
                "name": "Construction 1",
                "productLine": [
                  {
                    "id": "LineId1",
                    "name": "Line 1",
                    "productModel": [
                      {
                        "id": "pModelId1",
                        "name": "pModel 1",
                        "customerModel": [
                          {
                            "id": "cModelId1",
                            "name": "cModel 1"
                          }
                        ]
                      },
                      {
                        "id": "pModelId2",
                        "name": "pModel 2",
                        "customerModel": [
                          {
                            "id": "cModelId2",
                            "name": "cModel 2"
                          }
                        ]
                      }]
                    }]
                }]
            }]
        }]
    }
}

与上述结构相关的类:

public class Productcatalog
{
    public string id { get; set; }
    public string name { get; set; }
    public StructureResult result { get; set; }
}

public class StructureResult
{
    public Productfamily[] productFamily { get; set; }
}

public class Productfamily
{
    public string id { get; set; }
    public string name { get; set; }
    public Productcategory[] productCategory { get; set; }
    public FulfilsKeyTechnology[] FulfilsKeyTechnology { get; set; }
}

public class Productcategory
{
    public string id { get; set; }
    public string name { get; set; }
    public Productconstruction[] productConstruction { get; set; }
}

public class Productconstruction
{
    public string id { get; set; }
    public string name { get; set; }
    public Productline[] productLine { get; set; }
}

public class Productline
{
    public string id { get; set; }
    public string name { get; set; }
    public Productmodel[] productModel { get; set; }
}

public class Productmodel
{
    public string id { get; set; }
    public string name { get; set; }
    public Customermodel[] customerModel { get; set; }
}

public class Customermodel
{
    public string id { get; set; }
    public string name { get; set; }
}

我想要做的是在最后得到一个看起来像这样的列表,从具有相同属性的类序列化:

[   
  {
    "productConstructionId":"ConstructionId1",
    "productConstructionName":"Construction 1",
    "productLineId":"LineId1",
    "productLineName":"Line 1",
    "customerModelId":"cModelId1",
    "customerModelName":"cModel 1"
  },
  {
    "productConstructionId":"ConstructionId1",
    "productConstructionName":"Construction 1",
    "productLineId":"LineId1",
    "productLineName":"Line 1",
    "customerModelId":"cModelId2",
    "customerModelName":"cModel 2"
  }
]

与上述结构相关的类:

public class ModelList
{
    public string productConstructionId {get; set;}
    public string productConstructionName {get; set;}
    public string productLineId {get; set;}
    public string productLineName {get; set;}
    public string customerModelId {get; set;}
    public string customerModelName {get; set;}
}

在这种情况下,也许 linq 甚至不是最佳实践?

【问题讨论】:

  • 请您也发布您的两个课程吗?
  • @Serge 好了。

标签: c# linq .net-core nested-lists


【解决方案1】:

试试这个

var jsonDeserialized = JsonConvert.DeserializeObject<Data>(json);

var list = new List<ModelList>();
foreach (var pf in jsonDeserialized.Result.ProductFamily)
{
    foreach (var pct in pf.ProductCategory)
    {
        foreach (var pcn in pct.ProductConstruction)
        {
            foreach (var pl in pcn.ProductLine)
            {
                foreach (var pm in pl.ProductModel)
                {
                    foreach (var cm in pm.CustomerModel)
                    {
                        var item = new ModelList
                        {
                            ProductFamilyId = pf.Id,
                            ProducFamilyName = pf.Name,
                            ProductCategoryId = pct.Id,
                            ProductCategoryName = pct.Name,
                            ProductConstructionId = pcn.Id,
                            ProductConstructionName = pcn.Name,
                            ProductLineId = pl.Id,
                            ProductLineName = pl.Name,
                            CustomerModelId = cm.Id,
                            CustomerModelName = cm.Name
                        };
                            list.Add(item);
                    }
                }
            }
        }
    }
}

输出

[
  {
    "ProductFamilyId": "FamilyId1",
    "ProducFamilyName": "Family 1",
    "ProductCategoryId": "CategoryId1",
    "ProductCategoryName": "Category 1",
    "ProductConstructionId": "ConstructionId1",
    "ProductConstructionName": "Construction 1",
    "ProductLineId": "LineId1",
    "ProductLineName": "Line 1",
    "CustomerModelId": "cModelId1",
    "CustomerModelName": "cModel 1"
  },
  {
    "ProductFamilyId": "FamilyId1",
    "ProducFamilyName": "Family 1",
    "ProductCategoryId": "CategoryId1",
    "ProductCategoryName": "Category 1",
    "ProductConstructionId": "ConstructionId1",
    "ProductConstructionName": "Construction 1",
    "ProductLineId": "LineId1",
    "ProductLineName": "Line 1",
    "CustomerModelId": "cModelId2",
    "CustomerModelName": "cModel 2"
  }
]

public class ModelList
{
    public string ProductFamilyId { get; set; }
    public string ProducFamilyName { get; set; }
    public string ProductCategoryId { get; set; }
    public string ProductCategoryName { get; set; }
    public string ProductConstructionId { get; set; }
    public string ProductConstructionName { get; set; }
    public string ProductLineId { get; set; }
    public string ProductLineName { get; set; }
    public string CustomerModelId { get; set; }
    public string CustomerModelName { get; set; }
}

public partial class Data
{
    [JsonProperty("id")]
    public string Id { get; set; }

    [JsonProperty("name")]
    public string Name { get; set; }

    [JsonProperty("result")]
    public Result Result { get; set; }
}

public partial class Result
{
    [JsonProperty("productFamily")]
    public ProductFamily[] ProductFamily { get; set; }
}

public partial class ProductFamily
{
    [JsonProperty("id")]
    public string Id { get; set; }

    [JsonProperty("name")]
    public string Name { get; set; }

    [JsonProperty("productCategory")]
    public ProductCategory[] ProductCategory { get; set; }
}

public partial class ProductCategory
{
    [JsonProperty("id")]
    public string Id { get; set; }

    [JsonProperty("name")]
    public string Name { get; set; }

    [JsonProperty("productConstruction")]
    public ProductConstruction[] ProductConstruction { get; set; }
}

public partial class ProductConstruction
{
    [JsonProperty("id")]
    public string Id { get; set; }

    [JsonProperty("name")]
    public string Name { get; set; }

    [JsonProperty("productLine")]
    public ProductLine[] ProductLine { get; set; }
}

public partial class ProductLine
{
    [JsonProperty("id")]
    public string Id { get; set; }

    [JsonProperty("name")]
    public string Name { get; set; }

    [JsonProperty("productModel")]
    public ProductModel[] ProductModel { get; set; }
}

public partial class ProductModel
{
    [JsonProperty("id")]
    public string Id { get; set; }

    [JsonProperty("name")]
    public string Name { get; set; }

    [JsonProperty("customerModel")]
    public CustomerModel[] CustomerModel { get; set; }
}

public partial class CustomerModel
{
    [JsonProperty("id")]
    public string Id { get; set; }

    [JsonProperty("name")]
    public string Name { get; set; }
}

【讨论】:

  • 感谢您抽出宝贵时间并愿意帮助@Serge。看着你的例子,我注意到你错过了一个细节。抱歉不够清楚。 :) 你错过的细节是我已经知道最深层次的“customerModelId”。我只想要与该孩子的身份相关的信息和家长信息。我做了类似的事情,所以我知道可以以这种方式完成。 :) 我希望有更好的方法来使用 Linq 而不是一堆嵌套的 foreaches。
  • @John 感谢您的反馈。那你应该知道linq是把query转化为foreach循环,直接做会更高效。
猜你喜欢
  • 1970-01-01
  • 2021-12-18
  • 2013-10-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-14
  • 2019-05-12
相关资源
最近更新 更多