【问题标题】:Not counting null values from a linq LEFT OUTER JOIN query不计算 linq LEFT OUTER JOIN 查询中的空值
【发布时间】:2013-10-25 10:59:09
【问题描述】:

我有这个 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 的行

我怎样才能排除它们,还是我做错了?

【问题讨论】:

    标签: c# sql linq


    【解决方案1】:

    使用 .Any() 和 Let 怎么样?

    var yellows = odc.PersonAVCPermissions.Where(o => o.Status == (int)AVCStatus.Yellow);
    
    var q = from a in odc.AVCs
    let Y = (from p in yellows.Where(o => o.AVCId == a.Id) select p).Any()
    where Y == true
    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)
    };
    

    【讨论】:

    • 您建议的解决方案导致查询仅返回具有任何 PersonAVCPermissions 的 AVC,并且所有行的计数均为 1
    • 你确定?我没有要测试的源对象和数据集,但是在我放在一起的测试项目中,我得到了我期望看到的东西。 (这是否正确,我不确定……我以为我的回答是正确的。)哦,好吧……也许有人会从看到“让”的使用中获得价值。
    【解决方案2】:

    你不需要加入,也不需要分组:

    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()
            };
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-01-10
      • 1970-01-01
      • 1970-01-01
      • 2013-03-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多