我有这个 sql 查询,它完全符合我的要求,但我在 linq 中需要它。它返回一些 AVC 行并计算有多少 PersonAVCPermission 具有与其关联的状态 1
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() 它会完全跳过计数为 0 的行
我怎样才能排除它们,还是我做错了?