【问题标题】:Linq to sql left outer joinLinq to sql 左外连接
【发布时间】:2011-10-14 18:04:33
【问题描述】:

我在 SQL 中有以下内容:

SELECT * FROM (SELECT Teikoku_Sections.Section_ID, Teikoku_Sections.Section_Name, Teikoku_Sections.Section_Code, Teikoku_Sections.Show_In_Menu FROM Teikoku_Sections WHERE Teikoku_Sections.Show_In_Menu = 1) AS Sections
LEFT OUTER JOIN (SELECT Teikoku_Divisions.Division_ID, Teikoku_Divisions.Division_Name, Teikoku_Divisions.Division_Code, Teikoku_Divisions.Section_ID, Teikoku_Divisions.Show_In_Menu FROM Teikoku_Divisions WHERE Teikoku_Divisions.Show_In_Menu = 1) AS Divisions
ON Sections.Section_ID = Divisions.Section_ID;

对两个表 Teikoku_Sections 和 Teikoku_Divisions 执行左外连接,并将两个表中的可见项连接在一起。

表格具有以下结构:

Teikoku_Section: Section_ID int, Section_Name nvarchar(50), Section_Code int, Show_In_Menu 位

帝国_部门: Division_ID int, Division_Name nvarchar(50) Division_Code int, Section_ID int,

我希望最终得到一个表格,其中显示了 Show_In_Menu 为 true 的所有部分和分区,但在某些情况下,可能没有任何分区对应于一个部分,因此是 LEFT OUTER JOIN。

我只是不知道如何在 linq to sql 中执行此操作。

到目前为止我有:

//Get All Visible sections
    IQueryable<Teikoku_Section> visibleSections = from section in db.Teikoku_Sections where section.Show_In_Menu select section;
    //Get all visible divisions
    IQueryable<Teikoku_Division> visibleDivisions = from division in db.Teikoku_Divisions where division.Show_In_Menu select division;
    //Join the two together
    IQueryable menuItems = visibleSections.GroupJoin(visibleDivisions, section => section.Section_ID,
        division => division.Section_ID, (section, divisions) => new
        {
            Section_ID = section.Section_ID,
            Section_Name = section.Section_Name,
            Division_ID = divisions.Select(d => d.Division_ID),
            Division_Name = divisions.Select(d => d.Division_Name),
        });

    return menuItems;

这不太管用...我想我可能缺少 SelectMany(),但我就是不知道应该在哪里或如何放置它。

【问题讨论】:

  • 请格式化您的代码。
  • @Kerrek SB:完成,抱歉。

标签: linq-to-sql


【解决方案1】:

查看 DefaultIfEmpty (http://msdn.microsoft.com/en-us/library/bb355419.aspx)

【讨论】:

  • 感谢您的回答,但我不明白这有什么帮助......我上周才开始使用 linq to sql,但大部分内容仍然让我感到困惑。
  • 101 个样本中有一个例子:msdn.microsoft.com/en-us/vcsharp/ee908647#leftouterjoin。在您的情况下,如果您刚刚学习,我建议您使用 LINQ 语法而不是 Lambda 语法。 IQueryable menuItems = from section in visibleSections join joindivision in visibleDivisions on section.SectionID 等于 joindivision.SectionID 加入从加入中的分部。DefaultIfEmpty() 选择新 { section.Section_ID, section.Section_Name, Division.Division_ID, Division.Division_Name) }) ; (当然,您也可以获取 LINQ in Action 的副本并查看第 6 章)
  • 感谢您的两位 cmets 让我走上正轨,我解决了。如您所说,在linq语法中。我发布我的查询以供将来参考,但将此标记为答案,因为否则我不会得到它。谢谢!
【解决方案2】:

按照 Jim Wooley 的建议,最终以 linq 语法执行此操作。我得到了使用以下语法的查询:

IQueryable<Teikoku_Section> visibleSections = from section in db.Teikoku_Sections
                                                  where section.Show_In_Menu
                                                  select section;

    IQueryable<Teikoku_Division> visibleDivisions = from division in db.Teikoku_Divisions
                                                    where division.Show_In_Menu
                                                    select division;

    IQueryable menuItems = from section in visibleSections
                join division in visibleDivisions on section.Section_ID equals division.Section_ID into joined_SectionDivision
                from menuItem in joined_SectionDivision.DefaultIfEmpty()
                select new
                {
                    Section_ID = section.Section_ID,
                    Section_Name = section.Section_Name,
                    Division_ID = (menuItem == null) ? null : (int?)menuItem.Division_ID,
                    Division_Name = menuItem.Division_Name ?? null
                };

我花了好几个小时才得到这个结果,所以这里有一些解释给任何可能处于相同情况的人。

我不想要一个简单的左外连接,而是一个对两个表的项目都有条件的连接,即 Show_In_Menu 对两个表中的项目都为真,但不一定同时,所以一个部分可以是可见的,但它是分区可能不会,在这种情况下,我只希望结果中没有任何分区的部分在结果中出现一次。

出于这个原因,我创建了两个临时表,其中仅包含可见部分和分区项,然后使用这两组结果执行左外连接。

让我困惑了一阵子的是 .DefaultIfEmpty() 部分,它是处理空连接项所必需的。希望这对有一天尝试进行左外部联接的人有所帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-09-09
    • 2010-09-21
    • 2013-06-13
    • 1970-01-01
    • 2011-09-13
    • 1970-01-01
    相关资源
    最近更新 更多