c# - 在linq中加入两个数据表作为父子

标签 c# linq

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

结构很简单:
Parent 有一个 ID 和一些文本字段 child 有一个 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));

关于c# - 在linq中加入两个数据表作为父子,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24609239/

相关文章:

C# 在 Application.Run() 之后挂起并卡在 for 循环中

c# - 如何创建具有热插拔能力的松散耦合架构?

c# - Linq 扩展方法 - GetYearWeekFormat 扩展

c# - 检查 List<object> 是否包含所有整数

c# - 二元表达式无法转换为 LINQ 中的谓词表达式

linq - 将 Linq 转换为 FSharp 表达式

c# - MVC5 发现多个类型与名为 'Home' 的 Controller 匹配

c# - I/O操作中的多线程?

c# - 使用 PropertyInfo 忽略属性

linq to sql 与外键的关联问题