2013-05-31 88 views
1

我正试图将该模型压平成集合。LINQ:如何使用LINQ将深层嵌套对象压平

public class Category 
    { 
     public string name; 
     public string id;   
     public Subcategory subcategory; 
    } 


public class Subcategory 
{ 
    public string name; 
    public string id;   
    public List<Product> products; 
} 


public class Product 
{ 
    public string name; 
    public string id;   
    public Supplier1 supplier1; 
    public Supplier2 supplier2 
} 

public class Supplier1 
{ 
    public string name; 
    public string id;   

} 
public class Supplier2 
{ 
    public string name; 
    public string id;   

} 

我需要使用LINQ把它们变成以下类型的对象的集合:

public class MixedClass 
{ 
    public string CategoryId; 
    public string SubcategoryId;   
    public string ProductId ; 
    public string Supplier1Id ; 
    public string Supplier2Id ; 

} 

我已经试过,但的SelectMany我不能去得足够深。

+3

您可以发布您失败的尝试?目前尚不清楚你想要完成什么。这些课程如何组合在一起? – neontapir

+0

您如何期待我们获得ProductId?有**多个**'产品'。这就是为什么它出现在'List '中。 –

回答

4

你可以简单地这样做:

var results = 
    from c in Categories 
    from p in c.subcategory.products 
    select new MixedClass() 
    { 
     CategoryId = c.id, 
     SubcategoryId = c.subcategory.id, 
     ProductId = p.id, 
     Supplier1Id = p.supplier1.id, 
     Supplier2Id = p.supplier2.id, 
    }; 

或者如果你喜欢通顺语法:

var results = Categories 
    .SelectMany(c => c.subcategory.products, 
       (c, p) => new MixedClass() 
       { 
        CategoryId = c.id, 
        SubcategoryId = c.subcategory.id, 
        ProductId = p.id, 
        Supplier1Id = p.supplier1.id, 
        Supplier2Id = p.supplier2.id, 
       }); 
+0

第二个版本给我错误“x”为未知,它来自哪里? 然而,第一个版本正是我所需要的。谢谢! – rood

+0

@ user2373759糟糕,我已经用一种方式写了它(用'x'),然后改变了它 - 但是留下了那个部分。我已经纠正了它。 –