LINQ到按标识符分组的自定义类

时间:2015-03-23 17:01:50

标签: c# linq class datatable datatables

我有一个数据表,我需要将其解析为一组可管理的类数据。在大多数情况下,这不是一项艰巨的任务,但是,我需要在这些自定义类中将项目组合在一起才能理解它们。

public Parent
{
    Parent(){ }
    public int ParentID = 0;
    public string Name = string.Empty;
    public List<Children> Child = new List<Children>();
}

public Children
{
    public Children() { }
    public string ChildID = 0;
    public string Name = string.Empty;
    public List<string> ChildBooks = new List<string>();
}

 Parent ID |     Parent      | Child ID |     Child     |     Books 
1          | John            | 4        | Suzy          | Grapes of...
1          | John            | 4        | Suzy          | Huck........
1          | John            | 5        | James         | The adven...
2          | Sally           | 4        | Suzy          | Grapes of...
2          | Sally           | 4        | Suzy          | Huck........
2          | Sally           | 5        | James         | The adven...

结果

List<Parent> First index would be
Name: John
Child: 4 Suzy, 5 James

Second index would be
Name: Sally
Child: 4 Suzy (Grapes of..., Huck.....) 5 James (The adven...)

是否有一种不那么混乱的方式来实现这一目标?我当前的方法涉及抓取每个Distinct ParentID,将它们链接回子节点并在那里创建类。我还没有编写这部分代码,但如果这是唯一的方法,那就没关系了。我只是希望LINQ中有一些东西可以帮助我实现我的目标。

2 个答案:

答案 0 :(得分:1)

在ParentName上需要一个简单的GroupBy,试试这个: -

var query = dt.AsEnumerable().GroupBy(x => x.Field<string>("ParentName"))
                             .Select(x => new Parent
                                    {
                                        Name = x.Key,
                                        Child = x.Select(z => new Children
                                        {
                                            ChildID = z.Field<string>("ChildId"),
                                            Name = z.Field<string>("ChildName"),
                                            //If ChildBooks is `String`
                                            ChildBooks = String.Join(",",
                                               x.Select(b => b.Field<string>("Books")))
                                        }).ToList()
                                    });

以下是示例Fiddle,由于某些错误,它无法在fiddler中运行,但您可以复制粘贴并在visual studio中进行检查。

修改
在上面的查询中,如果ChildBooks的类型为String,那么您将获得逗号分隔的书籍,但如果您想要List<String>作为ChildBooks(那么显然他们不会成为你可以这样做: -

ChildBooks = x.Select(b => b.Field<string>("Books")).ToList();

答案 1 :(得分:0)

找出我需要的最终答案。 @RahulSingh带领我走上正确的道路。

var query = dt.AsEnumerable().GroupBy(x => x.Field<int>("Parent ID"))
     .Select(x => new Parent
     {
         ParentId = x.Key,
         Children = x.GroupBy(y => y.Field<int>("ChildID")).Select(z => new Children
         {
             ChildID = z.Key,
             Books = z.Select(b => b.Field<int>("Books")).ToList()
         }).ToList()
     });