[英]Entity Framework select distinct values from one to many table with filter
我正在尝试在EF中编写查询。
考虑以下关系:
目标是让教师具有学生的完整集合,他们在一定的过滤时间段(从-到)之间保持活跃。
我写了以下查询:
var filtered = _context.Teachers
.Join(_context.Students, // Target
fk => fk.Id, // FK
pk => pk.teacherId, // PK
(fk, pk) => new { teach = fk, students = pk }
)
.Where(i => i.students.date_active >= from &&
i.students.date_active <= to)
.OrderBy(i => i.teach.name)
.Select(i => i.teach)
.Include(i => i.Students)
.AsNoTracking();
通过此查询,我得到了重复的老师。 因此,我只添加Distinct()
运算符,然后有了老师。 但是后来我的老师对象仍然包含所有学生。 我只想要那个时期的学生。 对如何获得良好结果有帮助吗?
List<Dto.Teacher> list = filtered.Select(i => Dto.Teacher
{
id = i.Id,
name = i.name
Students = i.Students.Select(j => new Dto.Student
{
id = i.id,
date_active = i.date_active,
}).ToList(),
}).ToList();
public class Teacher()
{
public int id { get; set; }
public string name { get; set; }
public List<Dto.Student> Students { get; set; }
}
当使用诸如EF之类的ORM时,应尽可能避免使用join
运算符。
根据您的情况,您可以尝试以下操作(可能会发生变化):
_context.Teachers.
Where(t => t.Sudents.Any(s => s.date_active >= from &&
s.date_active <= to)
).
Select(t => new {
teacher = t,
activeStudents = t.Students.Where(s => s.date_active >= from &&
s.date_active <= to)
});
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.