Как я могу превратить эти соединения LINQ в соединения LEFT OUTER?
-
12-09-2019 - |
Вопрос
var auditAgencyRecords = (from ag in db.Agencies
join ara in db.AuditRuleAccounts on ag.Agency_Id equals ara.AgencyID
join arr in db.AuditRuleResults on ara.AuditRuleAccountID equals arr.AuditRuleAccountID
join are in db.AuditRuleEnterprises on arr.AuditRuleEnterpriseID equals are.AuditRuleEnterpriseID
where (rules.Select(r => r.EnterpriseID).Contains(arr.AuditRuleEnterpriseID))
select new
{
AgencyID = ag.Agency_Id,
AgencyName = ag.Agency_Name,
AuditRuleEnterpriseID = arr.AuditRuleEnterpriseID,
AuditRuleEnterpriseName = are.OverrideDisplayName,
CorrectedDate = arr.CorrectedDate,
NbrDaysToCorrect = arr.NbrDaysToCorrect,
});
Итак, я все еще новичок в LINQ to SQL, и мне нужна помощь, чтобы понять, как превратить это в левое внешнее соединение, а не во внутреннее соединение.
Из этого запроса выше я хочу, чтобы ВСЕ агентства были в таблице «Агенства», а затем записи справа (EnterpriseID, CorrectedDate и т. д.) могут быть нулевыми и т. д., если записи не существуют.
Я совершенно уверен, что мне нужно использовать SelectMany, но мне могли бы пригодиться некоторые рекомендации по превращению этих объединений в LEFT OUTER JOINS, поэтому у меня есть список всех агентств, а затем их возможные записи справа.
Решение
Ниже приведен код, с которого можно начать.
var auditAgencyRecords = (
from ag in db.Agencies
group join ara in db.AuditRuleAccounts on ag.Agency_Id equals ara.AgencyID into AgAra = group
from w in AgAra.DefaultIfEmpty()
group join arr in db.AuditRuleResults on ara.AuditRuleAccountID equals arr.AuditRuleAccountID into AraArr = group
from x in AraArr.DefaultIfEmpty()
group join are in db.AuditRuleEnterprises on arr.AuditRuleEnterpriseID equals are.AuditRuleEnterpriseID into ArrAre = group
from y in ArrAre.DefaultIfEmpty()
where (rules.Select(r => r.EnterpriseID).Contains(arr.AuditRuleEnterpriseID))
select new
{
AgencyID = w.Agency_Id,
AgencyName = w.Agency_Name,
AuditRuleEnterpriseID = y.AuditRuleEnterpriseID,
AuditRuleEnterpriseName = y.OverrideDisplayName,
CorrectedDate = w.CorrectedDate,
NbrDaysToCorrect = w.NbrDaysToCorrect,
});
Другие советы
Здесь хороший пример того, как это сделать.Важно не забывать о нулевых значениях, которые они могут вернуть — однажды это меня сильно уязвило.