【发布时间】:2010-01-07 18:44:42
【问题描述】:
我有一个从数据库中检索一组记录的方法。
我将这些数据映射到一个业务对象——我们称之为业务对象 ProcessModel。 ProcessModel 中的一个属性是一个列表,称为 ProcessChildren。属性为 List。
因此,数据由各种字段/属性链接。分层列表顶部有一个对象,然后该对象的 ProcessChildren 属性中有多个对象,这些对象的 ProcessChildren 属性中有多个对象等。
无论如何,我编写了相当多的代码来遍历返回的数据集,并构建分层列表,然后我将其绑定到 Silverlight 中的 TreeView。
如果有人可以为我提供一种更清洁、更简单的方法来执行此操作,我将非常感激,无论是使用 linq,还是使用 linq 或通过扩展方法的其他方法。
我已经包含了我当前使用的代码,希望能更好地说明我想要实现的目标。
var processes = new List<Process>();
var rootLevelProcesses = new List<Process>();
var allProcesses = new List<Process>();
foreach (Process process in e.Results)
{
process.ProcessChildren = new List<Process>();
if (process.ParentId > 0 || (process.ParentId == 0 && process.EntityId == 1))
{
allProcesses.Add(process);
}
}
var rootProcess =
(from parent in e.Results
where parent.EntityType == 1 && parent.ContainerLevel <= 1
select parent).FirstOrDefault();
processes.Add(rootProcess);
var level2Processes = (from parent in allProcesses
where parent.EntityType == 1 && parent.ContainerLevel == 2
select parent).ToList();
foreach (Process process in level2Processes)
{
var level3Processes = (from parent in allProcesses
where parent.EntityType == 1 && parent.ContainerLevel == 3
select parent).ToList();
process.ProcessChildren = level3Processes;
}
processes[0].ProcessChildren = level2Processes;
foreach (Process process in processes)
{
if (process.ProcessChildren != null && process.ProcessChildren.Count > 0)
{
foreach (Process level1 in process.ProcessChildren)
{
if (level1.EntityType == 1)
{
var children =
(from child in allProcesses
where child.ParentId == level1.EntityId
select child).ToList();
level1.ProcessChildren = children;
foreach (Process level2 in level1.ProcessChildren)
{
if (level2.EntityType == 1)
{
children =
(from child in allProcesses
where child.ParentId == level2.EntityId
select child).ToList();
level2.ProcessChildren = children;
foreach (Process level3 in level2.ProcessChildren)
{
if (level3.EntityType == 1)
{
children =
(from child in allProcesses
where child.ParentId == level3.EntityId
select child).ToList();
level3.ProcessChildren = children;
}
}
}
}
}
}
}
}
【问题讨论】:
标签: c# .net linq silverlight