联接两个集合
本文关键字:两个 集合 | 更新日期: 2023-09-27 18:06:21
我有一个包含id
和name
的集合persons
:
Dictionary<int, string> persons;
1约翰
2去核机
3 Carl
然后我有一个按组织的人员id集合:
IDictionary<int, IEnumerable<int>> workers;
100 - [1,2]
101 - []
102 - [3]
最后是只包含OrganizationId:
的主实体entity.OrganizationId = 100;
我需要遍历workers
并获得人员的所有id(它将给出:1,2
),最后从persons
获得这些人员的名称。我该怎么做呢?
如果您只想要这个特定OrganisationId
中的人员:
var personsFromOrganisation = workers[OrganizationId].Select(i => persons[i]);
如果您想要一个对象直接将所有OrganisationId
关联到相应的人员(这里使用字典):
var organisationsIds = entities.Select(e => e.OrganisationId).Distinct();
var personsByOrganisation = organisationsIds.ToDictionary(id => id, id => workers[id].Select(pid => persons[pid]));
不需要LINQ获取ID:
IEnumerable<int> orgWorkers = null;
bool containsOrg = workers.TryGetValue(entity.OrganizationId, out orgWorkers);
现在获取名称就很简单了:
List<string> workerNames = new List<string>();
if(containsOrg)
{
workerNames = orgWorkers
.Where(id => persons.ContainsKey(id))
.Select(id => persons[id])
.ToList();
}
您可以使用子查询获得所需的id,然后通过该连接:
var personsByOrganization =
from p in persons
join id in workers.Where(x => x.Key == entity.OrganizationId)
.SelectMany(x => x.Value)
on p.Key equals id
select p;
No-Join方法:
HashSet<int> Ids = new HashSet<int>(workers.Where(x => x.Key == entity.OrganizationId)
.SelectMany(x => x.Value));
Dictionary<int, string> personsByOrganization =
persons.Where(x => Ids.Contains(x.Key))
.ToDictionary(x => x.Key, x => x.Value);