我有以下查询:
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;
}