我有一个存储过程,它以下列格式返回数据:
public class Sp_Class
{
public int ItemId { get; set; }
public int ParentID { get; set; }
}
它将返回以下数据:
ItemId-ParentID
1-空
2-1
3-1
4-2
5-2
6-2
7-3
8-3
9-3
我现在想将它组织成以下递归类结构:
public class MappedStructure
{
public int ItemId { get; set; }
public List<MappedStructure> Children { get; set; }
}
它将把数据转换成以下格式:
4
2 5
6
1
7
3 8
9
我知道我可以编写一个函数来完成这个任务,但是我觉得应该已经有了一些工具来完成这个任务--例如,项目的其他部分已经使用了实体框架来完成这个任务。我相信这就是ORM所做的?
请注意,对于这个特定的查询,我不能使用实体,但这超出了本讨论的范围。
发布于 2018-08-22 09:11:33
下面是一个关于如何使用LINQ实现该操作的示例。首先是。我假设顶级项具有Null的父ID。
var dataTable = new DataTable();
// Call Sp and fill data in DataTale
表示每一项数据的类:
class Item {
public Int32 ItemId { get; set; }
public String Name { get; set; }
public IEnumerable<Item> Children { get; set; }
}
获取某一特定项目的子级的函数:
IEnumerable<DataRow> GetChildren(DataTable dataTable, Int32 parentId) {
return dataTable
.Rows
.Cast<DataRow>()
.Where(row => row.Field<Int32>("ParentID") == parentId);
}
用于创建包含子集合的项的函数。此函数将恢复层次结构:
Item CreateItem(DataTable dataTable, DataRow row) {
var id = row.Field<Int32>("ItemId");
var name = row.Field<String>("Name");
var children = GetChildren(dataTable, id)
.Select(r => CreateItem(dataTable, r))
.ToList();
return new Item { ItemId = id, Name = name, Children = children };
}
获取顶级项的行的函数:
IEnumerable<DataRow> GetTopLevelRows(DataTable dataTable) {
return dataTable
.Rows
.Cast<DataRow>()
.Where(row => row.Field<Int32>("ParentID") == null);
}
把这一切结合在一起:
var items = GetTopLevelRows(dataTable)
.Select(row => CreateItem(dataTable, row))
.ToList();
https://stackoverflow.com/questions/51963296
复制相似问题