我有以下表格
- 教室(班级ID、班级名称)
- 学生班级(学生ID,班级ID)
- 学生(学生ID、学生姓名等)
- 学生描述。 (学生描述 ID、学生 ID、学生描述)
我想检索学生的所有信息==1
在 sql 中,我会执行如下操作并获取有关学生的所有信息。
select * from Student s
join StudentClass sc on s.StudentID=sc.StudentID
join ClassRoom c on sc.ClassID=c.ClassID
left join StudentDescription sd on s.StudentID=sd.StudentID
where s.StudentID=14
现在是我的问题。使用 EF4 我做了类似的事情,但无法使其工作。
您还可以进行包含和左连接
尝试1
private static StudentDto LoadStudent(int studentId)
{
StudentDto studentDto = null;
using (var ctx = new TrainingContext())
{
var query = ctx.Students
.Include("ClassRooms")
.Include("StudentDescriptions")
.Where(x=>x.StudentID==studentId)
.SingleOrDefault();
studentDto = new StudentDto();
studentDto.StudentId = query.StudentID;
studentDto.StudentName = query.StudentName;
studentDto.StudentDescription = ??
}
return studentDto;
}
尝试2又不完整且错误
using (var ctx = new TrainingContext())
{
var query = (from s in ctx.Students
.Include("ClassRooms")
join sd in ctx.StudentDescriptions on s.StudentID equals sd.StudentID into g
from stuDesc in g.DefaultIfEmpty()
select new
{
Name=s.StudentName,
StudentId=s.StudentID,
}).SingleOrDefault();
正如你所看到的,我不知道我在这里做什么。
如何将该 Sql 转换为 EF 查询?
对的,这是可能的。
首先,.Include
执行 LEFT OUTER JOIN,使用导航属性你穿过。
这就是您在之间显式执行 LEFT JOIN 的方式Student and 学生描述:
var query = from s in ctx.Students
from sd in s.StudentDescriptions.DefaultIfEmpty()
select new { StudentName = s.Name, StudentDescription = sd.Description };
正如您所看到的,它根据之间的实体关联执行 JOINStudents and 学生描述。在您的 EF 模型中,您应该有一个名为的导航属性学生描述在你的Student实体。上面的代码只是使用它来执行连接,并且默认为空。
代码基本相同.Include
.
请不要混淆左连接 vs 左外连接。
他们是一样的东西。
“OUTER”关键字是可选的,我相信它是为了 ANSI-92 兼容性而存在的。
Just .Include
您查询中需要的一切:
using (var ctx = new TrainingContext())
{
studentDo = ctx.Students
.Include("ClassRooms")
.Include("StudentDescriptions")
.Where(x=>x.StudentID==studentId)
.Select(x => new StudentDto
{
StudentId = x.StudentId,
StudentName = x.StudentName
StudentDescription = x.StudentDescription.Description
})
.SingleOrDefault();
}
基本上,确保所有 FK 都表示为模型上的导航属性,如果是这样,则不需要执行任何连接。您需要的任何关系都可以通过.Include
.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)