如何在linq中允许null join结果?

时间:2016-11-16 11:09:02

标签: c# postgresql linq

我有以下查询:

var query = from a in context.TableA
            where (a.P1 == param1 || a.P2 == param2)
            join b in context.TableB
            on a.Id equals b.aId
            into bValues
            from b in bValues.DefaultIfEmpty().Where(bSubQ => bSubQ.X == (a.Y == param1 ? param2: param1))
            join c in context.TableC
            on b.cId equals c.Id
            into cValues
            from c in cValues.DefaultIfEmpty()
            select new
            {
                   A = a,
                   B = b,
                   C= c
             };

我有一个表(TableA),它总是有匹配参数param1和param2的id的条目,所以应该总是有两个结果。

但是,我想说“对于这些结果中的每一个,检查表B中是否存在连接结果,是否确保表B上的属性X是相反的参数。如果不是,请给我null然后,如果在表B中找到匹配项,则在表C中查找连接结果,如果未找到,则将C设置为空“。

我可以在一个查询中完成所有操作,还是需要将其分开?我也对postgresql中的函数开放,如果这样可以更容易。

编辑:我很难解释这个,也许这个辅助函数会解释我想要组合成一个查询的内容:

private static List<ResultTemp> TempGetResultTODODelete(DbContext context, long param1, long param2)
{
    var aResults= context.TableA
        .Where(a => (a.Id == param1 || a.Id == param2)
        .Take(2).ToList();

    var aIds = aResults.Select(a => a.Id).ToList();
    var bResults = context.TableB
        .Where(c => aIds.Contains(b.aId))
        .ToList();

    var bIds = bResults.Where(b => b.X == 
         (a.Y == param1 ? param2: param1)
               .Select(b => b.X)
               .ToList();

    var c = context.TableC
              .Where(c => bIds.Contains(c.Id))
              .FirstOrDefault();

    var result = new List<ResultTemp>();

    foreach(var a in aResults)
    {
        result.Add(new ResultTemp
        {
            A = a,
            B = bResults.Where(b => b.aId == b.Id).FirstOrDefault(),
            C = c
        });
    }

    return result;
}

0 个答案:

没有答案