[英]Joining two datatables as parent-child in linq
我需要構建從兩個不同的Excel來源讀取的父子對象的類型列表:一個描述父對象,另一個描述子對象。 層次結構只有2層。
讀入excel並不是問題,因為它被讀入2個未類型化的數據表中,但加入信息卻成為問題。
結構非常簡單:
父級有一個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]);
或者,使用詳細信息列表中的第一個元素:
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));
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.