2013-10-25 40 views
0

我有這個SQL查詢,正是我想要的,但我需要它在LINQ。它返回了幾個AVC行數多少PersonAVCPermission有鏈接到它的狀態1不計從linq的空值LEFT OUTER JOIN查詢

SELECT a.Id, a.Name, a.Address, COUNT(p.AVCID) AS Count 
FROM AVC AS a 
LEFT OUTER JOIN 
(
    SELECT PersonAVCPermission.AVCId 
    FROM PersonAVCPermission 
    WHERE PersonAVCPermission.Status = 1 
) AS p 
ON a.Id = p.AVCId 
GROUP BY a.Id, a.Name, a.Address 

我在LINQ此查詢和它在沒有PersonAVCPermission也應算做1

除了同樣的事情
var yellows = odc.PersonAVCPermissions.Where(o => o.Status == (int)AVCStatus.Yellow); 

var q = from a in odc.AVCs 
     from p in yellows.Where(o => o.AVCId == a.Id).DefaultIfEmpty() 
     group a by new { a.Id, a.Name, a.Address } into agroup 
     select new AVCListItem 
     { 
      Id = agroup.Key.Id, 
      Name = agroup.Key.Name, 
      Address = agroup.Key.Address, 
      Count = agroup.Count(o => o.Id != null) 
     }; 

即時猜測與DefaultIfEmpty()它把在隨後被計數,所以我嘗試使用排除它們在列表爲空行(O => o.Id!= NULL),但它仍然被一切,至少一個

如果我不使用DefaultIfEmpty()它跳過t他與計數0完全行

我如何排除他們或我做它完全錯誤?

回答

0

你不需要的加入,也沒有集團化:

var q = from a in odc.AVCs 
     select new AVCListItem 
     { 
      Id = a.Id, 
      Name = a.Name, 
      Address = a.Address, 
      Count = yellows.Where(o => o.AVCId == a.Id).Count() 
     }; 
+0

哇,現在我覺得荒謬:P。謝謝 – Imapler

1

如何使用.Any()和Let?

​​
+0

你的建議的解決方案使查詢只返回的AVC任何PersonAVCPermissions和計數爲1的所有行 – Imapler

+0

你肯定?我沒有源代碼對象和數據集來測試,但是在我放在一起的測試項目中,我得到了我期望看到的結果。 (不管這是否正確,我不確定...我認爲我正確回答了這個問題。)哦,好吧......也許有人從看到一個「Let」的使用中獲得了價值。 –