【问题标题】:LINQ: how to group by so element can be added to many groupsLINQ:如何分组,以便元素可以添加到多个组中
【发布时间】:2015-01-23 12:22:55
【问题描述】:

我有 3 种类型:ParameterFacilityLocationParameter 有一个FacilityFacilityLocation 是多对多相关的。所以,如果我们进行连接,我们可以得到这样一个表:

ParamId FacilityId LocationId
1            1          1
1            1          2
2            2          1
2            2          3

现在我想按位置对参数进行分组,以便获得字典>,如下所示:

LocationId   Parameters
     1          1,2
     2           1
     3           2

我不能直接使用 GroupBy,因为我不知道如何编写 keySelector。我也尝试过这样的 SelectMany:

parametersList.SelectMany(t=>t.Facility.Locations).GroupBy(t =>t)
.ToDictionary(t=>t.Key, t=>t.Select(val=>val))

但它不能形成我的字典..

更新: 这是我的设施(简化)的样子:

public class Facility
{
    public int Id { get; set; }
    public ICollection<Location> Locations { get; set; }
}

这里是位置:

public class Location
{
    public int Id { get; set; }
    public ICollection<Facility> Facilities { get; set; }
}

如有任何帮助,我将不胜感激!

【问题讨论】:

  • 你如何定义类FacilityLocation
  • @CuongLe 更新了我的问题

标签: c# linq group-by


【解决方案1】:

这个查询返回你想要的:

parametersList
        .SelectMany(_ => _.Facility.Locations)
        .GroupBy(_ => _)
        .ToDictionary(
            _ => _.Key, 
            _ => _.SelectMany(l => l.Facilities).SelectMany(f => f.Parameters).Distinct().ToArray());

更新

您可以使用parametersList 或为其存储参数:

parametersList
        .SelectMany(_ => _.Facility.Locations)
        .GroupBy(_ => _)
        .ToDictionary(
            _ => _.Key, 
            _ => _.SelectMany(l => l.Facilities).Select(f => parametersList.Single(p => p.Facility == f)).Distinct().ToArray());

【讨论】:

  • 如果我的“设施”没有“参数”属性怎么办?
  • 真棒!非常感谢!
猜你喜欢
  • 2018-09-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-10-19
  • 1970-01-01
  • 1970-01-01
  • 2017-09-08
相关资源
最近更新 更多