简体   繁体   中英

Linq query to filter multi level classes

I have my departments data coming from the database. I want to filter this data based on certain criteria.

[  
   {  
      "Id":10,
      "Name":"Name 10",
      "Teachers":[  
         {  
            "TeacherId":100,
            "TeacherName":null,
            "DepartmentId":100,
            "Students":[  
               {  
                  "StudentId":1001,
                  "StudentName":null,
                  "TeacherId":10,
                  "DepartmentId":100
               }
            ]
         },
         {  
            "TeacherId":101,
            "TeacherName":null,
            "DepartmentId":100,
            "Students":[  
               {  
                  "StudentId":1001,
                  "StudentName":null,
                  "TeacherId":10,
                  "DepartmentId":100
               }
            ]
         }
      ]
   },
   {  
      "Id":100,
      "Name":"Name 10",
      "Teachers":[  
         {  
            "TeacherId":0,
            "TeacherName":null,
            "DepartmentId":100,
            "Students":[  
               {  
                  "StudentId":5000,
                  "StudentName":null,
                  "TeacherId":50,
                  "DepartmentId":100
               }
            ]
         }
      ]
   },
   {  
      "Id":50,
      "Name":"Name 10",
      "Teachers":[  
         {  
            "TeacherId":0,
            "TeacherName":null,
            "DepartmentId":100,
            "Students":[  
               {  
                  "StudentId":2000,
                  "StudentName":null,
                  "TeacherId":50,
                  "DepartmentId":100
               }
            ]
         }
      ]
   }
]

Now I have to filter the departments based on some values as shown below

var departmenIds = new List<int>() { 10, 20, 30 };
var teachers = new List<int>() { 100, 200, 300 };
var students = new List<int>() { 1000, 2000, 3000 };

I am looking for a query that will return the data in a following fashion

If all department ids exists in the json it will return entire data. If a department with a particular teacher is in the list then only return that teacher and the department. like wise for the student.

I tried this to test if it atleast work at the second level but I am getting all the teachers

var list = allDeplrtments.Where(d => d.Teachers.Any(t => teachers.Contains(t.TeacherId))).ToList();
var list = allDepartments
    .Where(d => departmentIds.Contains(d.Id))
    .Select(d => new Department() {
        Id = d.Id,
        Name = d.Name,
        Teachers = (d.Teachers.Any(t => teacherIds.Contains(t.TeacherId))
            ? d.Teachers.Where(t => teacherIds.Contains(t.TeacherId))
            : d.Teachers)
                .Select(t => new Teacher() {
                    TeacherId = t.TeacherId,
                    TeacherName = t.TeacherName,
                    DepartmentId = d.Id,
                    Students = t.Students.Any(s => studentIds.Contains(s.StudentId))
                        ? t.Students.Where(s => studentIds.Contains(s.StudentId))
                        : t.Students
                })
    })

Would something like this work for you?

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM