用于筛选多级类的 Linq 查询



我的部门数据来自数据库。我想根据某些条件过滤这些数据。

[  
{  
"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
}
]
}
]
}
]

现在我必须根据一些值过滤部门,如下所示

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

我正在寻找一个将以以下方式返回数据的查询

如果 json 中存在所有部门 ID,它将返回整个数据。如果列表中有特定教师的部门,则仅返回该教师和部门。对学生来说就像明智一样。

我尝试这样做来测试它是否至少在第二级有效,但我得到了所有的老师

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
})
})

这样的东西对你有用吗?

最新更新