Linq SelectMany包括父母

时间:2015-12-16 20:51:36

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

我有以下三个Linq To Sql实体:Location,Institution和Building。

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

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

ERD with relevant columns

更新

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

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

1 个答案:

答案 0 :(得分:0)

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

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

但是代码没有从这里得到任何清洁,你的解决方案非常简单,它完成了工作。

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