Linq分组基于其他组

时间:2010-08-31 09:37:33

标签: c# linq group-by

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

alt text

交易保存在交易清单中:

 List<Transaction> transactions

每个交易都有一个属性暴露其“DeviceId”

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

 IEnumerable<IGrouping<String,Device>>

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

Linq语句需要做的是查看事务列表并使用“groupedDevices”列表查看它所属的父项,然后按此分组。

1 个答案:

答案 0 :(得分: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