c# Linq查找嵌套数组对象中的特定项



我正在使用asp.net core webapi和azure cosmosdb开发应用程序。我需要从对象列表中找到一项。我对linq没有经验。在下面的json中,我需要找到一个获得learnerId" "123"的部门id。我期望输出如下:

"id"7 d65fa4c - 86 - ed - 4 - e07 - 9 - e9a a1583df5715c"

部门:

[
{
"name": "Emp1",
"edsNumber": "",
"sectors": [
{
"id": "7d65fa4c-86ed-4e07-9e9a-a1583df5715c",
"name": "Technology1",
"learners": [
{
"learnerId": "123",
"learnerName": "Learner1",
"dateAdded": 1612872051
},
{
"learnerId": "456",
"learnerName": "Learner2",
"dateAdded": 1612877369
},
{
"learnerId": "789",
"learnerName": "Learner3",
"dateAdded": 1612877372
},
{
"learnerId": "12314",
"learnerName": "Learner4",
"dateAdded": 1613065233
},
{
"learnerId": "2346",
"learnerName": "Learner5",
"dateAdded": 1613577350
}
],
"course": {
"name": "Angularv10",
"isCompleted": true
},
"contact": {
"name": "Voytek",
"jobTitle": "Designer1",
"email": "rana@gmail.com",
"isCompleted": true
}
}
]
},
{
"name": "Emp2",
"edsNumber": "",
"sectors": [
{
"id": "7d65fa4c-86ed-4e07-9e9a-a1583df5235c",
"name": "Technology1",
"learners": [
{
"learnerId": "834457",
"learnerName": "Learner6",
"dateAdded": 1612872051
},
{
"learnerId": "11122",
"learnerName": "Learner7",
"dateAdded": 1612877369
}
],
"course": {
"name": "Angularv10",
"isCompleted": true
},
"contact": {
"name": "Voytek",
"jobTitle": "Designer1",
"email": "rana@gmail.com",
"isCompleted": true
}
}
]
}
]

我试了如下:

var sectorId = (from e in employers
from s in e.Sectors
from l in s.Learners
where l.LearnerId == learnerEntity.Id
select s.Id).FirstOrDefault();

有更好的实现方式吗?如何获得该行业所属的行业编号和雇主?

查找满足子对象条件的单个项的LINQ查询将包含两个组件:

  • 调用SingleOrDefault(或Single,如果你寻找的项目必须在那里),和
  • 调用嵌套在第一个条件中的Any,以查看子项目是否存在。

由于您的部门嵌入在雇主内部,您可以使用SelectMany将列表扁平化。

如下图所示:

var sectorId = employers
.SelectMany(e => e.Sectors) // Flatten sectors
.SingleOrDefault(
s => s.Learners.Any(sl => sl.Id == targetId)
).Id;

这在问题中不是很清楚,但是"sector "显然是一个数组。如果员工有多个部门,并且搜索到的LearnerId预计会出现在两个或更多部门中,那么返回一个sectorId的枚举将是必要的:

(根据Sergey Kalinichenko的回答略有不同的版本):

IEnumerable<Guid> sectorIds = employers
.SelectMany(e => e.Sectors) // Flatten sectors
.Where(s => s.Learners.Any(sl => sl.Id == targetId))
.Select(s => s.Id);

最新更新