2013-07-30 2 views
6

Я этот запрос работает отлично:Linq к SQL Left Join, заказ и Group By Count

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. Он возвращает count = 1, когда left join возвращает null. Таким образом, я пытался этот запрос:

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

Вы группируете здание по его идентификатору, так что в группе будет только одно здание (при условии, что идентификатор уникален). Если ваша первая группировка будет группировать '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