使用LINQ过滤整个分层列表

时间:2011-10-11 13:17:27

标签: linq entity-framework hierarchy

我有一个简单的对象“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

由于

1 个答案:

答案 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();
    }
}