2013-07-30 47 views
6

我有此查詢工作完美:LINQ到SQL左連接,排序和分組按計數

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 

但是我沒有得到預期的結果,當我把它轉換到LINQ。當左連接返回null時,它返回count = 1。所以,我一直在嘗試此查詢:

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

是SQL是否正確?你將被加入到用戶,並且無所事事。我錯過了什麼嗎? –

+0

@ErenErsönmez你是對的。我已經從INNER變成了LEFT,忘了把它拿出來。即使它沒有改變最終結果。 – Gandarez

+0

你正在用建築物ID來編組建築,所以這個建築羣只有一棟建築物(假設ID是唯一的)。你的第一個分組是否應該將'buildingUser'而不是'building'分組? –

回答

7

試試這個:

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

謝謝。工作完美! – Gandarez