代码之家  ›  专栏  ›  技术社区  ›  Retrocoder

基于其他组的Linq分组

  •  1
  • Retrocoder  · 技术社区  · 14 年前

    我正在表中存储事务。这些事务具有与层次结构树中的父节点相关的ID。我的树的示例如下图所示。我需要允许最终用户检索事务并根据需要对它们进行分组,因为它们随后会根据分组写入文件。在设备(IM001-1等)下方的图像中创建事务。在实时版本中,树会更大,并且可以有更多的级别,用于城镇和更小的区域等。现在解决这个问题。假设一个用户需要来自英国设备的所有事务,并且他们希望按照国家节点(即UK\ U North和UK\ U South)对它们进行分组。结果应该是一个分组列表,在本例中,该列表将包含两个项。第一项将包含来自设备IM001-1和IM001-2的所有事务,第二项将包含设备IM002-1和IM002-2的事务。到目前为止,我所做的是获取每个父节点的设备列表。因此,我有一个分组列表,其中每个项目都包含其所有子设备的ID。Id想要做的是使用Linq来查看我的所有事务及其Id,并创建一个分组列表,分组在其中检查哪个父事务拥有它。这一切听起来相当复杂,所以如果它不清楚,我可以提供额外的细节,如果需要的话。我处理这个问题的方法对吗?因为可能会有很多事务,我不想为每个事务做很多树导航,因为性能会受到影响。

    alt text

    交易记录在交易清单中:

     List<Transaction> transactions
    

    然后,当我将鼠标悬停在var上时,有一个分组列表,定义如下:

     IEnumerable<IGrouping<String,Device>>
    

    此列表称为groupedDevices。列表中的每一项表示一个父节点(例如UK\u North),其中包含该节点下所有可用设备的列表。每个设备都有一个DeviceId属性。

    1 回复  |  直到 14 年前
        1
  •  1
  •   svick bala    14 年前

    如果不知道所拥有的类,就很难编写实际的查询,但这样的操作应该可以:

    from country in countries
    from device in country.Devices
    from transaction in device.Transactions
    group transaction by country
    

    或:

    from country in countries
    select new
    {
      Country = country,
      Transactions = from device in country.Devices
                     from transaction in device.Transactions
                     select transaction
    }
    

    编辑:

    from g in groupedDevices
    from device in g
    from transaction in transactions
    where transaction.DeviceId == device.Id
    group transaction by g