c# - 实体框架使用过滤器从一对多表中选择不同的值
问题描述
我正在尝试在 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)
});
推荐阅读
- php - 如何使用 PHP 使用来自 MySQL 服务器的 ajax 请求填充输入字段?
- javascript - 获取字符中某些元素的滚动位置
- haskell - 在 IO monad 中获取列表的第一个元素
- asp.net - 将发布的本地网站的 IIS 配置
- python - 在 pygame 中渲染文本会导致延迟
- vue.js - 是否可以使用 vue 可拖动的 quasar 组件?
- python - 我有一个列表,而不是其中包含更多的 dict 并想删除其中一个,但 dict 是动态的
- javascript - AWS Lambda 挂在特定的 GET 调用上
- flutter - 保持小部件对齐
- c++ - C++ 未定义对 '_imp__StretchBlt@44 的引用