2013-07-30 49 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