2016-06-17 13 views
3

Ich versuche links drei Tabellen mit LINQ verbinden. Ich habe arbeiten die SQL wie folgt:Wie links Join mehrere Tabellen mit LINQ

Select j.Id, u.FirstName , u.LastName, u.Role 
From Job j 
    left join JobTranslator as jt on j.Id = jt.JobId 
    left join JobRevisor as jr on j.Id = jr.JobId 
    left join [User] as u on jt.UserId = u.Id OR jr.UserId = u.Id 
Where u.Id = someID; 

ich es bekommen kann mit zwei arbeiten wie unten schließt sich:

IQueryable<Job> jobs = 
       from j in _db.Jobs 

       join jr in _db.JobRevisors on j.Id equals jr.JobId into jrs 
       from jrResult in jrs.DefaultIfEmpty() 

       join u in _db.Users on jrResult.UserId equals u.Id into jrU 
       from jrUResult in jrU.DefaultIfEmpty() 

       where jrUResult.Id == userId 
       orderby j.Id 
       select j; 

Aber wenn ich versuche, meine letzte benötigte Tabelle beitreten es funktioniert nicht wie unten.

IQueryable<Job> jobs = 
       from j in _db.Jobs 

       join jt in _db.JobTranslators on j.Id equals jt.JobId into jts 
       from jtResult in jts.DefaultIfEmpty() 

       join jr in _db.JobRevisors on jtResult.Id equals jr.JobId into jrs 
       from jrResult in jrs.DefaultIfEmpty() 

       join u in _db.Users on jrResult.UserId equals u.Id into jrU 
       from jrUResult in jrU.DefaultIfEmpty() 

       join u in _db.Users on jtResult.UserId equals u.Id into jtU 
       from jtUResult in jtU.DefaultIfEmpty() 

       where jtUResult.Id == userId 

       orderby j.Id 

       select j; 

Irgendwelche Ideen von irgendjemandem?

+1

Mögliche Duplikat [LEFT OUTER JOIN in LINQ] (http://stackoverflow.com/questions/3404975/left-outer-join-in-linq) – Win

+0

Vielleicht ist das umbenennen zweites 'u' zu etwas anderem? – Quentin

+0

Was ich nicht verstehe ist, warum Entwickler darauf bestehen, das SQL wortwörtlich in LINQ zu übersetzen, anstatt Navigationseigenschaften, Sammlungen und '.Include()' zu verwenden. In der Regel ergibt sich auf diese Weise ein intuitiver verwendbares Objektdiagramm. –

Antwort

5

Von Linq - left join on multiple (OR) conditions:

IQueryable<Job> jobs = (from j in _db.Jobs 

       join jt in _db.JobTranslators on j.Id equals jt.JobId into jts 
       from jtResult in jts.DefaultIfEmpty() 

       join jr in _db.JobRevisors on jtResult.Id equals jr.JobId into jrs 
       from jrResult in jrs.DefaultIfEmpty() 


       join u in _db.Users on jtResult.UserId equals u.Id into jtU 
       from jtUResult in jtU.DefaultIfEmpty() 

       where jtUResult.Id == userId 

       orderby j.Id 

       select j).Concat(
       from j in _db.Jobs 

       join jt in _db.JobTranslators on j.Id equals jt.JobId into jts 
       from jtResult in jts.DefaultIfEmpty() 

       join jr in _db.JobRevisors on jtResult.Id equals jr.JobId into jrs 
       from jrResult in jrs.DefaultIfEmpty() 

       join u in _db.Users on jrResult.UserId equals u.Id into jrU 
       from jrUResult in jrU.DefaultIfEmpty() 

       where jtUResult.Id == userId 

       orderby j.Id 

       select j 
       ).Distinct() 
+0

Vielen Dank! Das funktionierte, ich musste es ein wenig zwicken, aber die grundlegende Verkettungsidee funktionierte. Danke noch einmal! – codingNightmares