2016-11-12 98 views
0

我有如下嵌套类的定义:转换数据表到nestead类由LINQ

[XmlRoot()] 
public class cars 
{ 
    [XmlElement(ElementName="car")] 
    public car[] carList { get; set; } 
} 
public class car 
{ 
    [XmlElement(ElementName = "manufacture")] 
    public string manufacture { get; set; } 
    [XmlElement(ElementName = "models")] 
    public models modelList { get; set; } 
} 
public class models 
{ 
    [XmlElement(ElementName = "model")] 
    public model[] modelList { get; set; } 
} 
public class model 
{ 
    [XmlElement(ElementName = "name")] 
    public string name { get; set; } 
    [XmlElement(ElementName = "color")] 
    public string color { get; set; } 
} 

我有一个数据表如下:

DataTable dt = new DataTable(); 
    dt.Columns.Add("Manufacture"); 
    dt.Columns.Add("ModelName"); 
    dt.Columns.Add("Color"); 

    Object[] rows = { 
     new Object[]{"P1","405","1,6"}, 
     new Object[]{"P1","406","1,7"}, 
     new Object[]{"P2","407","1,8"}, 
     new Object[]{"P2","408","1,9"} 
    }; 
    dt.Rows.Add(rows); 

我想我的数据在数据表转换为我的一流的汽车。 任何帮助,将不胜感激。
更新: 对于使用建议,我需要更改Rows.Add与下面的代码,否则,我只会得到结果中的对象。

  DataRow dr= dt.NewRow(); 
     dr["Manufacture"] = "Peugeot1"; 
     dr["ModelName"] = "405"; 
     dr["Color"] = "1,6"; 
     dt.Rows.Add(dr); 
     DataRow dr2 = dt.NewRow(); 
     dr2["Manufacture"] = "Peugeot1"; 
     dr2["ModelName"] = "406"; 
     dr2["Color"] = "1,7"; 
     dt.Rows.Add(dr2); 
     DataRow dr3 = dt.NewRow(); 
     dr3["Manufacture"] = "Peugeot2"; 
     dr3["ModelName"] = "405"; 
     dr3["Color"] = "1,6"; 
     dt.Rows.Add(dr3); 
+0

环行,并通过列值Car' – Fabio

+0

类的'对应的属性是否有任何特别的理由来创建'model'类来代表'model'类的数组,而不是直接在'car'类中使用'model'类的数组? – YuvShap

+0

@SomeUser是的,我使用这个类来创建XML文档,我需要模型节点的模型列表节点。 –

回答

1

使用GroupBy将所有由Manufacture行,然后为每个组项目的新Car。要填充ModelList财产上的组使用Select

var result = (from row in dt.AsEnumerable() 
       group row by row.Field<string>("Manufacture") into grouping 
       select new Car 
       { 
        Manufacture = grouping.Key, 
        ModelList = grouping.Select(item => new Model 
        { 
         Name = item.Field<string>("ModelName"), 
         Color = item.Field<string>("Color") 
        }).ToArray() 
       }).ToList(); 

您还可以使用与GroupBy过载的方法来调用,您可以指定一个选择谓词:

var result = dt.AsEnumerable() 
       .GroupBy(row => row.Field<string>("Manufacture"), 
         row => new Model 
         { 
          Name = row.Field<string>("ModelName"), 
          Color = row.Field<string>("Color") 
         }) 
       .Select(group => new Car 
       { 
        Manufacture = group.Key, 
        ModelList = group.ToArray() 
       }).ToList(); 

请注意,我有变化类和属性名相匹配的C#命名约定

+0

感谢您的帮助。这是很有帮助的。还有一个问题,在您的代码中,我需要通过设置列值(请参阅原始帖子中的代码)来更改我的DataTable以添加新记录。如果我使用我原来的方式添加行,它将返回对象而不是实际值。你能分享我为什么发生这种情况吗? –

+0

谢谢,我发现我的问题,我的第一种方法是错误的,现在它的工作原理是通过添加行循环行。 –

+0

@爱德华 - 高兴我的回答有帮助,而且你设法解决下一个问题:) –