【问题标题】:Joining two datatables as parent-child in linq在linq中将两个数据表作为父子连接
【发布时间】:2014-07-07 11:11:54
【问题描述】:

我需要构建从两个不同 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。

编辑:玩了一会儿之后,我只是让父类和子类都输入了类型,因为最初让它们大多不输入的原因导致的问题比它所阻止的要多。这是一个更大项目的一部分,在这个项目中,无类型化是解决我们在具有非分层数据的其他类上的问题的更好解决方案。

【问题讨论】:

  • 所以Bay 应该有某种ParkingLotId,而ParkingLot 应该有一个Id 和一个ParkingSiteId 等等?
  • 查看我更新的问题。 ParkingSites 实际上只是 ParkingLots 的列表,仅此而已。
  • 那么你怎么知道Bay.BayDetails中的哪个字符串引用了ParkingLost.ParkingLotDetails中的哪个字符串呢?

标签: c# linq


【解决方案1】:

您可以简单地按父 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));

【讨论】:

  • 谢谢。你的解决方案对我有用,我最终为父母和孩子分别创建了一个完全类型化的类,因为它太乱了,无法继续使用非类型化数据。这是一个更大的集成测试项目的一部分,到目前为止,我已经能够使用 untyped 将测试值传递到测试中,QA 团队成员只需等待几分钟即可添加新的测试字段。这是从电子表格中读取的第一个分层测试数据,其他的模式被证明是不正确的。哦,YLAL!
猜你喜欢
  • 1970-01-01
  • 2014-01-12
  • 1970-01-01
  • 2011-04-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多