【问题标题】:Linq SelectMany include parentLinq SelectMany 包括父级
【发布时间】:2015-12-16 20:51:36
【问题描述】:

我有以下三个 Linq To Sql 实体:位置、机构和建筑物。

Location 表只是一个 LocationId 和 LocationTypeId。

Institution 和 Building 都以一对一的关系从 Location 表中获取它们的 Id,并且 Institution 表与 Building 表具有一对多的关系。

我正在尝试返回一个机构及其所有子项的所有位置记录。以下查询返回我需要的内容,但缺少父机构位置记录。

var query = dc.Locations.SelectMany(l => l.Institutions, (loc, inst) => new { loc, inst })
                        .SelectMany(i => i.inst.Buildings, (locInst, bld) => bld.Location );

如何将父母和孩子一起包括在内?

更新:

如果我在原始位置查询上使用联合,我可以获得我想要的记录,但我仍然想知道这是否是最佳解决方案。这是Union的代码。

IQueryable<Location> locations = dc.Locations;

locations.SelectMany(l => l.Institutions, (loc, inst) => new { loc, inst })
         .SelectMany(i => i.inst.Buildings, (locInst, bld) => bld.Location)
         .Union(locations);

【问题讨论】:

  • 你能发布实体类吗?至少足以显示它们之间的关系?
  • @DanNixon 我已经添加了带有相关列的实体类的图像
  • 最好使用Concat 而不是Union,除非你实际上做了不同的值而不是简单的连接。虽然我不确定,但我相信Concat 会映射到 SQL 中的Union All,这样会更高效。
  • @erdomke 你是对的,Concat 确实映射到 SQL 中的 Union All,但是,就我而言,我确实想要不同的值。

标签: c# linq sql-server-2008 linq-to-sql parent-child


【解决方案1】:

嗯,这是一个棘手的问题,我不认为它会变得更好,尽管如果你想要某种排序,比如第一个机构位置,那么你可以这样做:

locations.SelectMany(l => l.Institutions, (loc, inst) => new { loc, inst })
         .SelectMany(i => i.inst.Buildings.Union(new List<Building> { new Building { Location = i.loc } }), (locInst, bld) => bld.Location);

但是代码并没有从这里变得更清晰,您的解决方案非常简单,并且可以完成工作。

这会影响性能并会消耗更多内存(如果重要的话)但是如果这是您正在寻找的,我希望它有所帮助。 (因为存储位置的顺序)

【讨论】:

    【解决方案2】:

    这样的事情怎么样:

            var t = from p in allParents
                    from c in p.Children
                    select new { Parent = p, Child = c };
    

    【讨论】:

    • 请添加更多详细信息以扩展您的答案,例如工作代码或文档引用。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-24
    • 1970-01-01
    • 1970-01-01
    • 2017-11-15
    • 1970-01-01
    相关资源
    最近更新 更多