2013-07-30 77 views
6

Tôi đã truy vấn này làm việc một cách hoàn hảo:LINQ to SQL Left Join, Trình tự, Nhóm By Đếm

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 

Tuy nhiên tôi không nhận được kết quả mong đợi khi tôi chuyển nó sang LINQ. Nó trả về count = 1 khi left join trả về null. Vì vậy, tôi đã cố gắng truy vấn này:

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

là sql của bạn có đúng không? bạn đã tham gia vào Người dùng và không làm gì với nó. Tui bỏ lỡ điều gì vậy? –

+0

@ ErenErsönmez bạn nói đúng. Tôi đã thay đổi từ INNER sang LEFT và quên lấy nó ra. Ngay cả khi nó ra không thay đổi kết quả cuối cùng. – Gandarez

+0

Bạn đang tạo nhóm theo ID của nó, do đó nhóm đó sẽ chỉ có một tòa nhà trong đó (giả sử ID là duy nhất). Nhóm đầu tiên của bạn có nên nhóm 'buildingUser' thay vì' building' không? –

Trả lời

7

Hãy thử điều này:

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

Cảm ơn bạn. Làm việc hoàn hảo! – Gandarez

Các vấn đề liên quan