LINQ Left Join和GroupBy

时间:2016-06-07 14:01:30

标签: c# linq-to-entities

假设我有这个SQL查询:

SELECT 
    PromotionSlot.StaffFName, 
    SUM(PromotionSlot.Max_Occupancy) AS TOTAL,
    SUM(DISTINCT(Booking.Quantity)) AS Occupied
From PromotionSlot 
LEFT JOIN Booking
ON PromotionSlot.StaffID=Booking.StaffID
GROUP BY  PromotionSlot.StaffFName

结果:

|StaffFName    |TOTAL    |Occupied|
-----------------------------------
|Jason         |13       |1       |
|John Doe      |9        |0       |      
|Marry Jane    |7        |2       |

这是我的数据库表:

PromotionSlot TABLE: ID(PK),Max_Occupancy,StaffFName..., StaffID(FK)
Booking TABLE: ID(PK), Quantity...,StaffID(FK) 

如何将其翻译成LINQ?这是我的尝试:

var staffData = 
    (from ps in dc.PromotionSlots
     join b in dc.Bookings on ps.StaffID = b.StaffID
     group ps by ps.StaffFName into NewGroup
     select new dataView
     {
         StaffFName = NewGroup.Key,
         Total = NewGroup.Sum(a => a.Max_Occupancy),

         //problem:
         //Occupied = NewGroup.Sum(b => b.Quantity)
     }

计划拥有Occupied = NewGroup.Sum(b => b.Quantity),但当我尝试将b指向quantity表中的Booking列时,它会显示错误(红线),我认为来自group ps by ps.StaffFName into NewGroup的问题使其可用于PromotionSlot表而不是Booking表。但我完全不知道如何解决这个问题!

1 个答案:

答案 0 :(得分:2)

根据您的SQL查询,您需要的是Distinct个量和Sum个。

var staffData = 
    (from ps in dc.PromotionSlots
     join b in dc.Bookings on ps.StaffID = b.StaffID into slots
     from slot in slots.DefaultIfEmpty()
     group new {ps, slot} by ps.StaffFName into NewGroup
     select new dataView
     {
         StaffFName = NewGroup.Key,
         Total = NewGroup.Sum(a => a.ps!=null? a.ps.Max_Occupancy: 0),

         //problem:
         Occupied = NewGroup.Select(x=>x.slot.Quantity).Distinct().Sum()
     }