【问题标题】:Linq grouping based on other groups基于其他组的Linq分组
【发布时间】:2010-08-31 09:37:32
【问题描述】:

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

交易保存在交易列表中:

 List<Transaction> transactions

每个事务都有一个属性可以公开其“DeviceId”

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

 IEnumerable<IGrouping<String,Device>>

此列表称为“groupedDevices”。列表中的每个项目代表一个父节点(例如 UK_North),其中包含该节点下所有可用设备的列表。每个设备都有一个“DeviceId”属性。

Linq 语句需要做的是查看事务列表,并使用“groupedDevices”列表查看它属于哪个父级,然后按该列表进行分组。

【问题讨论】:

    标签: c# linq group-by


    【解决方案1】:

    在不知道你拥有的类的情况下,很难编写实际的查询,但这样的事情应该可以工作:

    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
    

    【讨论】:

    • 我已经尝试过您的代码示例,但运气不佳。我在原始问题中添加了更多细节,包括类名。有了这些附加信息,你认为你的代码应该还能工作吗?
    猜你喜欢
    • 2013-09-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-13
    • 1970-01-01
    • 2023-01-05
    • 1970-01-01
    相关资源
    最近更新 更多