2013-07-30 19 views
6

Ho questa domanda perfettamente funzionante:LINQ to SQL LEFT JOIN, Ordine e Gruppo dal conte

SELECT B.ID, B.NAME, COUNT(BU.ID) AS TOTAL 
FROM Building B 
LEFT JOIN BuildingUser BU ON BU.ID_BUILDING = B.ID  
GROUP BY B.ID, B.NAME 
ORDER BY COUNT(BU.ID) DESC, B.NAME 

Tuttavia non sto ottenendo il risultato previsto quando ho convertirlo in LINQ. Restituisce count = 1 quando left join restituisce null. Così, ho cercato fuori questa domanda:

var list1 = (from building in db.GetTable<Building>() 
      join entitybuildinguser in db.GetTable<BuildingUser>() 
       on building.ID equals entitybuildinguser.ID_BUILDING into tmpbuildinguser 
       from buildinguser in tmpbuildinguser.DefaultIfEmpty()     
      group building by new 
      { 
       building.ID, 
       building.NAME 
      } into grpBuilding             
      orderby grpBuilding.Select(g => g.ID).Count() descending, grpBuilding.Key.NAME 
      select new 
      { 
       ID_BUILDING = grpBuilding.Key.ID, 
       NAME = grpBuilding.Key.NAME, 
       users = grpBuilding.Select(g => g.ID).Count() 
      }); 
+0

È il vostro SQL corretta? ti rimane unito agli utenti e non fai nulla con esso. Mi sto perdendo qualcosa? –

+0

@ ErenErsönmez hai ragione. Sono cambiato da INTERNO a SINISTRA e ho dimenticato di tirarlo fuori. Anche se è fuori non cambia il risultato finale. – Gandarez

+0

Stai raggruppando la costruzione in base al suo ID, in modo che il gruppo abbia sempre un solo edificio (supponendo che l'ID sia univoco). Il tuo primo raggruppamento dovrebbe raggruppare 'buildingUser' invece di' building'? –

risposta

7

Prova questa:

from b in db.Buildings 
join u in db.BuildingUsers on b.ID equals u.ID_BUILDING into g 
orderby g.Count() descending, b.Name descending 
select new 
{ 
    Id = b.ID, 
    Name = b.NAME, 
    Total = g.Count() 
} 
+0

Grazie. Perfetto! – Gandarez