我有以下课程:
public class Teacher
{
Guid ID;
string Name;
string Address;
string Tel;
ICollection<Student> Students;
}
public class Student
{
Guid id;
string Name;
string Address;
string Tel;
ICollection<Teacher> Teachers;
}由于这是一个多对多的关系,EF将创建一个连接表TeacherStudent.我想找到所有的老师和老师的学生名单(只有姓名),例如:
Teacher1 name:
Student1 name,
Student3 name,
Student5 name,
Student9 name
Teacher2 name:
Student1 name,
Student2 name,
Student3 name,
Student9 name我试过:
_context.Teacher.Include(x=>x.TeacherStudent).ThenInclude(y=>y.Student);
这是工作和学生的信息是一个名单下的每一个老师。然而,我不想要所有的信息,我只想知道名字。我试过了SelectMany,但是它使数据变平了,并且我让老师的名字为每个学生重复。如何才能得到一个学生名字的名单,在老师的名字和不检索字段,我不需要?
谢谢。
发布于 2022-09-19 04:36:18
Include用于急切地加载相关实体。Select用于将实体查询投影到所需的数据结构中,或者以其他方式检索有关实体的信息片段。
这样你就可以得到一张老师和学生名字的清单:
var teachers = _context.Teacher
.Select(t => new
{
t.Id,
t.Name,
Students = t.Students.Select(s => new
{
s.Id,
s.Name
}).ToList()
}).ToList();这将返回一个匿名类型,其中包含一个教师列表,只返回他们的ID和名称,以及一个带有学生ID和名称的学生匿名类型集合。
通常,在读取带有投影的数据时,读取is是个好主意,因为您通常希望使用这些信息来显示详细信息、删除或以其他方式更改条目。
如果我使用投影,这是否意味着EF在投影之前仍然会检索所有字段
投影构建一个SQL查询,仅提取填充所请求的数据结构所需的字段。它不加载实体,因此这在某种程度上是与Include相互排斥的。您不需要“包括”相关实体来使用投影。
在执行更新时,您通常会使用使用Include的热切加载。例如,如果要向教师添加或删除学生协会,则需要加载教师和相关学生,以确保更改跟踪了解您在从教师中添加或删除学生时所做的事情。
https://stackoverflow.com/questions/73767903
复制相似问题