2016-06-07 12 views
0

Let sagen, dass ich diese SQL-Abfrage haben:LINQ LEFT JOIN und GroupBy

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 

Ergebnis:

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

Das ist mein DB-Tabelle:

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

Wie kann ich es übersetzen in LINQ? Dies ist mein Versuch:

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

-Plan Occupied = NewGroup.Sum(b => b.Quantity) zu haben, aber wenn ich versuche, die b auf die quantity Spalte von Booking Tabelle zeigt es zeigt Fehler (rot-Linie) und ich denke, die Probleme kommt von group ps by ps.StaffFName into NewGroup zur Verfügung stellt für PromotionSlot Tabelle statt Booking Tabelle. Aber ich habe keine Ahnung, wie ich das lösen soll!

Antwort

2

Basierend auf Ihrer SQL Abfrage, was Sie brauchen, nehmen Sie Distinct Mengen und Sum sie.

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() 
    } 
+0

Wenn Sie versuchen, 'x => x einzugeben. 'es zeigt immer noch die' ps' Tabellenspalte nur anstelle von 'b' Tabelle. – J4X

+2

Sie müssen beide Entitäten gruppieren new {ps, b} durch ps.StaffFName in NewGroup'. – juharr

+0

@ J4X bitte überprüfen Sie jetzt. –