使用LINQ保留父级的过滤树列表

问题描述 投票:0回答:1

我有一个看起来像这样的模型类:

public class Employee
{ 
    public int Id {get;set;}
    public int ParentId {get;set;}
    public string Name{get;set;}
    public string Designation {get;set;}
    public List<Employee> Reportees {get;set;}
}

使用它模拟了一个带有数据的演示树列表:

new List<Employee> employees
{
    new Employee{Id = 1,ParentId = 0,Name = "A",Designation = "CEO",Reportees = new List<Employee>{
      new Employee{Id = 2,ParentId = 1,Name = "B",Designation = "Manager",Reportees = new List<Employee>{
        new Employee{Id = 4, ParentId = 2, Name = "D", Designation = "Lead", Reportees = new List<Employee>
            {
                new Employee{Id = 6, ParentId = 4, Name = "F", Designation = "Developer", Reportees = new List<Employee> () },
                new Employee{Id = 7, ParentId = 4, Name = "G", Designation = "Developer", Reportees = new List<Employee>() }
            } 
        },
      new Employee{Id = 3,ParentId = 1,Name = "C",Designation = "Manager",Reportees = new List<Employee>{
        new Employee{Id = 5, ParentId = 3, Name = "E", Designation = "Lead", Reportees = new List<Employee>
            {
                new Employee{Id = 8, ParentId = 5, Name = "H", Designation = "Developer", Reportees = new List<Employee> () }
            } 
        }
    }
};

我需要过滤上面的列表,以在子对象满足过滤条件的情况下甚至显示父对象。同样,这里有一个问题,那就是如果父母是满足条件的孩子,而不是孩子被忽略。

有没有可用的扩展程序,或者我可以使用LINQ做到这一点?

为了更清楚地说明,如果过滤器搜索条件是ID 6和7,则这是预期的过滤列表:

new List<Employee> employees
{
    new Employee{Id = 1,ParentId = 0,Name = "A",Designation = "CEO",Reportees = new List<Employee>{
      new Employee{Id = 2,ParentId = 1,Name = "B",Designation = "Manager",Reportees = new List<Employee>{
        new Employee{Id = 4, ParentId = 2, Name = "D", Designation = "Lead", Reportees = new List<Employee>
            {
                new Employee{Id = 6, ParentId = 4, Name = "F", Designation = "Developer", Reportees = new List<Employee> () },
                new Employee{Id = 7, ParentId = 4, Name = "G", Designation = "Developer", Reportees = new List<Employee>() }
            } 
        }
    }
};

并且如果要过滤的ID为6

new List<Employee> employees
{
    new Employee{Id = 1,ParentId = 0,Name = "A",Designation = "CEO",Reportees = new List<Employee>{
      new Employee{Id = 2,ParentId = 1,Name = "B",Designation = "Manager",Reportees = new List<Employee>{
        new Employee{Id = 4, ParentId = 2, Name = "D", Designation = "Lead", Reportees = new List<Employee>
            {
                new Employee{Id = 6, ParentId = 4, Name = "F", Designation = "Developer", Reportees = new List<Employee> () }
            } 
        }
    }
};

并且如果要过滤的ID为2

new List<Employee> employees
{
    new Employee{Id = 1,ParentId = 0,Name = "A",Designation = "CEO",Reportees = new List<Employee>{
      new Employee{Id = 2,ParentId = 1,Name = "B",Designation = "Manager",Reportees = new List<Employee>()}
    }
};C#
c# linq foreach expression-trees
1个回答
0
投票

不,没有现成的Linq表达式可以为您做到这一点,您应该编写自己的表达式并实现您的扩展方法以实现您所希望的行为:

© www.soinside.com 2019 - 2024. All rights reserved.