我有一个数据表,我需要将其解析为一组可管理的类数据。在大多数情况下,这不是一项艰巨的任务,但是,我需要在这些自定义类中将项目组合在一起才能理解它们。
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中有一些东西可以帮助我实现我的目标。
答案 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()
});