从下面的代码中,我想过滤并希望仅获得MasterproductID = 1
及其子项。通过过滤MasterproductID = 2
和MasterproductID = 3
。 我可以知道该怎么做?谢谢你的帮助。在C#中使用过滤器表达式
class TreeNode
{
public int MasterProductId;
public int? ParentId;
}
protected void Page_Load(object sender, EventArgs e)
{
var list = new List<TreeNode>{
new TreeNode{ MasterProductId = 1 },
new TreeNode{ MasterProductId = 4, ParentId = 1 },
new TreeNode{ MasterProductId = 7, ParentId= 4 },
new TreeNode{ MasterProductId = 5, ParentId = 1 },
new TreeNode{ MasterProductId = 6, ParentId = 1 },
new TreeNode{ MasterProductId = 2 },
new TreeNode{ MasterProductId = 7, ParentId = 2 },
new TreeNode{ MasterProductId = 8, ParentId= 7 },
new TreeNode{ MasterProductId = 3 },
};
foreach (var item in Level(list, null, 0))
{
if (item.Value == 0)
{
Response.Write(String.Format("<b>MasterProductId={0}, Level={1}", item.Key, item.Value) + "</b><br />");
}
else
{
Response.Write(String.Format("MasterProductId={0}, Level={1}", item.Key, item.Value) + "<br />");
}
}
}
private static IEnumerable<KeyValuePair<int, int>> Level(List<TreeNode> list, int? parentId, int lvl)
{
return list
.Where(x => x.ParentId == parentId)
.SelectMany(x =>
new[] { new KeyValuePair<int, int>(x.MasterProductId, lvl) }.Concat(Level(list, x.MasterProductId, lvl + 1))
);
}
也许查询需要是递归的输出? –
如果是这样的话,目前的数据模型设计得非常差,而且确实需要进行一些重构才能使其效率和优雅。在我看来,在内存表示中添加对父对象的真实引用(即使这些内容来自SQL表格)将是最好的方法。 – SAJ14SAJ