Home > Software engineering >  Get Child and Parent property values from class with nested arrays using LINQ
Get Child and Parent property values from class with nested arrays using LINQ

Time:11-17

So another linq question.

Is there any way to extract child and parent property values via linq knowing only the value of the deepest nested child property?

To be expand on my question this is what i'm looking to do:

I have this, but as a much in a much bigger version. though the basic format construction ca be understood here. And i deserialize the object to a c# class:

{
  "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"
                          }
                        ]
                      }]
                    }]
                }]
            }]
        }]
    }
}

Class(es) related to structure above:

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; }
}

An what i'm looking to do is to get a list looking like this at the end, serialized from a class having the same properties that is:

[   
  {
    "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"
  }
]

Class related to structure above:

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;}
}

Maybe linq isn't even best practice in this case?

CodePudding user response:

try this

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);
                    }
                }
            }
        }
    }
}

output

[
  {
    "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"
  }
]

classes

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; }
}
  • Related