2017-12-15 4 views
-4

Wie kann ich "übersetzen" diese SQL-Abfrage Linq Lambda Expression:LINQ mit Lambda-Ausdruck - LEFT JOIN, GroupBy, Graf

Select SC.[Description], 
     COUNT(C.[StatusID]) as Amount 
From [StatusCandidate] SC 
Left Join 
     (Select * 
     From [Candidate] AS c 
     Where c.RequestID = 1) AS C 
ON C.StatusID = SC.StatusCandidateID 
Group By SC.[Description]; 

Ich versuche es, aber das Ergebnis ist nicht korrekt:

dbContext.StatusCandidates 
    .GroupJoin(
     dbContext.Candidates.Where(u => u.RequestID == requestId), 
     x => x.StatusCandidateID, 
     y => y.StatusID, 
     (x, y) => new {x, y}) 
    .GroupBy(g => new {g.x.Description}) 
    .Select(z => new AmountStatus{ 
     StatusName = z.Key.Description, 
     Amount = z.Count() 
    }).ToList(); 

Antwort

1

Sie sind dem gewünschten Ergebnis ziemlich nahe: Ihr LINQ macht einen inneren Join, während Ihr SQL einen äußeren Join hat.

dbContext.StatusCandidates 
    .GroupJoin(
     dbContext.Candidates.Where(u => u.RequestID == requestId) 
    , x => x.StatusCandidateID 
    , y => y.StatusID 
    , (x, y) => new { StatusCandidate = x, StatusGroup = y } 
    ) 
    .SelectMany(
     x => x.StatusGroup.DefaultIfEmpty() 
    , (x, y) => new { x.StatusCandidate, Status = y} 
    ) 
    .GroupBy(g => new { g.StatusCandidate.Description }) 
    .Select(z => new AmountStatus{ 
     StatusName = z.Key.Description 
    , Amount = z.Count() 
    }).ToList(); 

Referenz: How do you perform a left outer join using LINQ extension methods