【问题标题】:How can I turn these LINQ joins into LEFT OUTER joins?如何将这些 LINQ 联接转换为 LEFT OUTER 联接?
【发布时间】:2009-07-09 19:39:39
【问题描述】:
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 还是很陌生,我需要帮助弄清楚如何将其转换为左外连接,而不是内连接。

根据上面的查询,我希望从 Agencies 表中获取所有机构,然后如果不存在记录,右侧的记录(EnterpriseID、CorrectedDate 等)可以为空,等等。

我相当肯定我需要使用 SelectMany,但我可以使用一些指导将这些联接转换为 LEFT OUTER JOINS,因此我有一个所有机构的列表,然后在右侧列出它们可能的记录。

【问题讨论】:

    标签: linq linq-to-sql join left-join


    【解决方案1】:

    以下是一些可以帮助您入门的代码。

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

    【讨论】:

    • ... group join a in as ... equals ... into xs = group ... 语法是什么?我以前从未见过这样使用过的组,而且我似乎找不到任何关于它的文档。
    【解决方案2】:

    Here 是一个很好的例子。 重要的是不要忘记这些可以带回的空值——这让我很难过一次。

    【讨论】:

    • 我认为这不适用。它不显示跨表的左连接。
    猜你喜欢
    • 1970-01-01
    • 2020-10-02
    • 1970-01-01
    • 1970-01-01
    • 2011-05-06
    • 2012-04-05
    • 1970-01-01
    • 2020-06-29
    • 1970-01-01
    相关资源
    最近更新 更多