我有一个简单的对象“ProductGroups”(IQueryable)的列表。 每个“ProductGroup”都有一个名为“Children”的ProductGroups集合,一个整数ParentId字段和一个布尔“IsEnabled”字段。
public class ProductGroup
{
public int Id;
public int ParentId;
public ICollection<ProductGroup> Children;
public bool IsEnabled;
}
我希望能够返回“IsEnabled”为真的ProductGroups树。
目前,如果我这样做
ProductGroups.Where(x => x.IsEnabled)
这将返回已启用的产品。如果我做
ProductGroups.Where(x => x.ParentId == null)
返回根。我希望能够以尽可能最好的方式返回一个完整的树,不包括禁用的项目(即在查询集合后不使用for循环)。
ProductGroup1 (IsEnabled == true)
|
--------- ProductGroup2 (IsEnabled == true)
| |
| ----------- ProductGroup4 (IsEnabled == false)
|
--------- ProductGroup4 (IsEnabled == false)
即。返回带有1个子ProductGroup2的ProductGroup1
由于
答案 0 :(得分:0)
我不确定过滤集合的确切需求。我把它看作View-Model
。并且递归扩展方法为您提供了一种实现此过滤器的简洁方法:
public static class Helper
{
public static ICollection<ProductGroup> EnabledWithChildren(this ICollection<ProductGroup> source)
{
var result = new List<ProductGroup>();
foreach (var ele in source)
{
if(ele.IsEnabled == true)
{
var productGroup = new ProductGroup{Id = ele.Id, IsEnabled = ele.IsEnabled, ParentId = ele.ParentId};
if(ele.Children != null && ele.Children.Count() > 0)
productGroup.Children = ele.Children.EnabledWithChildren();
result.Add(productGroup);
}
}
return result;
}
}
用法:
public class ProductGroup
{
public int Id;
public int? ParentId;
public ICollection<ProductGroup> Children;
public bool IsEnabled;
static void Main()
{
var filteredProductGroups = ProductsGroups.EnabledWithChildren();
}
}