在linq中将两个数据表作为父子连接
本文关键字:数据表 两个 连接 父子 linq | 更新日期: 2023-09-27 18:11:50
我需要建立一个从两个不同的Excel源读取的父-子对象的类型列表:一个描述父对象,另一个描述子对象。这个层次结构只有2层。
读入excel不是问题,因为它被读入2个未类型化的数据表,但加入信息是。
结构非常简单:
Parent有一个ID和一些文本字段孩子有一个parentID(所以它是1-m)和一些文本字段
这些将被填充到的对象看起来像这样:
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。
编辑:在玩了一会儿之后,我只是让父类和子类都类型化,因为最初的原因让他们大多没有类型化导致更多的问题,而不是它阻止。这是一个更大的项目的一部分,在这个项目中,非类型性是一个更好的解决方案,可以解决我们在其他类上的问题,这些类的数据不是分层的。
您可以简单地按父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]);
或者,使用details列表中的第一个元素:
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));