C# LINQ左联接和GroupBy

C# LINQ左联接和GroupBy,c#,linq-to-entities,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.

假设我有一个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       |
这是我的DB表:

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)
     }

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

根据您的
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()
     }

根据您的
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()
     }

当尝试键入
x=>x.
时,它仍然只显示
ps
表列,而不是
b
表。您需要将两个实体
groupnew{ps,b}按ps.StaffFName分组到NewGroup
@J4X中。现在我可以在
选择new
中搜索两个表,但仍然不正确。第一个
Sum
应该使用类似lambda的
a=>a.ps.Max_Coccupancy
,第二个应该有
x=>x.b.Quantity
。当尝试键入
x=>x.
时,它仍然只显示
ps
表列,而不是
b
表。您需要对这两个实体进行分组
对新的{ps,b}通过ps.StaffFName进入新组
@J4X请现在检查。现在我可以在
选择新
中搜索两个表,但仍然不正确。第一个
Sum
应使用类似于
a=>a.ps.Max_Coccupancy
的lambda,第二个应具有
x=>x.b.Quantity