LINQ with Lambda表达式 - Left Join,GroupBy,Count

时间:2017-12-15 12:50:53

标签: c# sql linq lambda

如何将此SQL查询“转换”为Linq Lambda Expression:

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];

我试试,但结果不正确:

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();

1 个答案:

答案 0 :(得分:4)

您非常接近所需的结果:您的LINQ进行内连接,而您的SQL有外连接。

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();

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