使用 LINQ 从具有嵌套数组的类中获取子属性值和父属性值

Posted

技术标签:

【中文标题】使用 LINQ 从具有嵌套数组的类中获取子属性值和父属性值【英文标题】:Get Child and Parent property values from class with nested arrays using 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 好了。 【参考方案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循环,直接做会更高效。

以上是关于使用 LINQ 从具有嵌套数组的类中获取子属性值和父属性值的主要内容,如果未能解决你的问题,请参考以下文章

Linq 查询以返回具有特定属性值的嵌套数组

如何从具有父类引用的类中获取记录?

如何使用 linq 从父类和嵌套数组子类中获取值?

LINQ:获取包含具有特定名称和值的属性的数组中的对象

我可以在属性中指定路径以将我的类中的属性映射到我的 JSON 中的子属性吗?

引用泛型类型的类属性