Entity Framework inclure avec left join est-ce possible?
J'ai les tableaux suivants
- Salle De Classe (ClassID,ClassName)
- StudentClass (StudentID,ClassID)
- Étudiant (StudentID,StudentName,Etc..)
- StudentDescription. (StudentDescriptionID,StudentID,StudentDescription)
Je veux récupérer toutes les informations de l'étudiant==1
En sql, je voudrais faire quelque chose comme ci-DESSOUS et obtenez toutes les infos à propos d'un étudiant.
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
Maintenant mon problème.À l'aide de EF4 j'ai fait quelque chose comme ça, mais impossible de le faire fonctionner.
Aussi pouvez-vous faire un include et un left join
Tentative 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;
}
Tentative 2 encore incomplète et mal
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();
Comme vous pouvez le voir, je ne sais pas ce que je fais ici.
Comment puis-je convertir Sql dans une Requête EF?
Vous devez vous connecter pour publier un commentaire.
Oui, c'est possible.
Tout d'abord,
.Include
fait une JOINTURE EXTERNE GAUCHE, à l'aide de la de navigation propriété vous passer à travers.Voici comment vous pouvez explicitement faire un LEFT JOIN entre Étudiant et StudentDescription:
Comme vous pouvez le voir, c'est la scène la JOINTURE basée sur l'entité de l'association entre Étudiants et StudentDescriptions. Dans votre modèle EF, vous devriez avoir une navigation propriété appelée StudentDescriptions sur votre Étudiant entité. Le code ci-dessus est simplement en utilisant que pour effectuer la jointure, et défaillant; si vide.
Le code est fondamentalement identique à
.Include
.S'il vous plaît ne pas se confondre avec LEFT JOIN vs JOINTURE EXTERNE GAUCHE.
Ils sont la même chose.
L ' "EXTÉRIEUR" mot clé est facultatif, je crois qu'il est là pour ANSI-92 compatibilité.
Juste
.Include
tout ce dont vous avez besoin dans votre requête:Fondamentalement, assurez-vous que tous vos FK sont exprimées en tant que propriétés de navigation sur votre modèle, puis si donc, vous n'avez pas besoin de faire toutes les jointures. Toutes les relations que vous avez besoin peut être fait avec
.Include
..Include
fait une JOINTURE EXTERNE. Si vous incluez une propriété qui se trouve être vide (pas là), l'original est toujours retourné.Je viens d'avoir ce problème, dans mon cas, c'était la EntityTypeConfiguration que c'était faux
J'ai eu:
Au lieu de:
Il semble HasRequired fait une JOINTURE INTERNE alors que HasOptional fait une JOINTURE GAUCHE.
Exactement:
select * from Student s LEFT JOIN StudentDescription sd on s.StudentID=sd.StudentID
.