在linq中将两个数据表作为父子连接

时间:2014-07-07 11:11:55

标签: c# linq

我需要构建一个从两个不同的Excel源读取的父子对象的类型列表:一个描述父对象,另一个描述子对象。层次结构只有2层 读入excel不是问题,因为它被读入2个无类型数据表,但加入信息是。

结构非常简单:
父有一个ID和一些文本字段 孩子有一个parentID(所以它的1米)和一些文本字段

要填充这些对象的对象如下所示:

public class ParkingSites
{
    public List<ParkingLot> Lots { get; set; }

    public ParkingSites(List<ParkingLot> arg)
    {
        Lots = arg;
    }
}

public class ParkingLot
{
    public List<Bay> Bays{ get; set; }
    public int Id { get; set; }
    public List<string> ParkingLotDetails { get; set; } 
    public ParkingLot()
    {

    }
}

public class Bay
{
    public List<string> BayDetails { get; set; }
    public int ParentId { get; set; }    
    public Bay()
    {

    }
}

excel源具有固定的列顺序,其中父表的第一列是parentId,子表的第一列也是parentId。

编辑:在玩了一下之后,我只是输入了父类和子类,因为将它们保留为无类型的最初原因会导致更多的问题而不是它所阻止。这是一个较大项目的一部分,其中无类型是一个更好的解决方案,可以解决我们在其他类上的问题,这些类的数据不是层次结构。

1 个答案:

答案 0 :(得分:4)

您可以简单地按父ID列出子项列表,然后遍历父项并添加属于它的每个子项。

例如,您可以使用ToLookup

// assuming you have all Bay instances in a collection called bays
var baymap = bays.ToLookup(b => b.ParentId);

// and all ParkingLot instances in a collection called lots
foreach(var lot in lots)
    lot.Bays.AddRange(baymap[lot.Id]);

或者,使用详细信息列表中的第一个元素:

var baymap = bays.ToLookup(b => b.BayDetails[0]);

foreach(var lot in lots)
    lot.Bays.AddRange(baymap[lot.ParkingLotDetails[0]]);

或者,在没有查找的情况下使用Where(可能更慢,取决于您的数据):

foreach(var lot in lots)
    lot.Bays.AddRange(bays.Where(b => b.ParentId == lot.Id));