C#Linq在嵌套数组对象中查找特定项目 [英] C# Linq find particular item in nested array object
问题描述
我正在使用asp.net核心webapi和azure cosmosdb开发应用程序.我需要从对象列表中找到一个项目.我对linq没有经验.在下面的json中,我需要找到一个获得了learningerId的扇区ID:"123".我期望输出如下:
I am developing an application using asp.net core webapi and azure cosmosdb. I need to find an item from the list of objects. I am not experienced with linq. In the below json, i need to find a sector id who got a learnerId": "123". I am expecting output like:
"id":"7d65fa4c-86ed-4e07-9e9a-a1583df5715c"
"id": "7d65fa4c-86ed-4e07-9e9a-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();
是否有更好的方法来实现?以及如何同时获得SectorId和该部门所属的雇主?
Is there a better way to achieve? And how to get both the SectorId and the employer the sector belongs to?
推荐答案
查找满足子对象条件的单个项目的LINQ查询将包含两个部分:
LINQ query that looks for a single item that satisfies a condition on a child object would have two components:
- 调用
SingleOrDefault
(如果要查找的项必须存在,则调用Single
),并且 - 对
Any
的调用嵌套在第一个条件中,以查看子项在那里.
- A call to
SingleOrDefault
(orSingle
if the item you look for must be there), and - A call to
Any
nested inside the first condition to see that the child item is there.
由于您的行业已嵌入雇主内部,因此您可以使用 SelectMany
来平整列表.
Since your sectors are embedded inside employers, you could flatten the list with SelectMany
.
这是它的外观:
var sectorId = employers
.SelectMany(e => e.Sectors) // Flatten sectors
.SingleOrDefault(
s => s.Learners.Any(sl => sl.Id == targetId)
).Id;
这篇关于C#Linq在嵌套数组对象中查找特定项目的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!