LINQ:如何分组所以元素可以添加到多个组
LINQ: how to group by so element can be added to many groups
我有 3 种类型:Parameter
、Facility
和 Location
。 Parameter
有一个 Facility
并且 Facility
与 Location
是多对多相关的。所以,如果我们做一个连接,我们可以得到这样一个 table:
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; }
}
如有任何帮助,我将不胜感激!
您想要的查询return:
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());
我有 3 种类型:Parameter
、Facility
和 Location
。 Parameter
有一个 Facility
并且 Facility
与 Location
是多对多相关的。所以,如果我们做一个连接,我们可以得到这样一个 table:
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; }
}
如有任何帮助,我将不胜感激!
您想要的查询return:
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());