Find parent id from nested array

Viewed 92

I have the following JSON. I would like to query to find the employer id whose sector has got the learnerId: "123". I raised similar query in stackoverflow C# Linq find particular item in nested array object and got a reply but need to find the root id.

This is my query which only gets only the sectorid, but I need to get the employer id (ie. the root id.) The expected output is "id": "1000000000000"

var sectorId = employers
                .SelectMany(e => e.Sectors)
                .SingleOrDefault(sector => 
                    sector.Learners.Any(learner => learner.LearnerId == learnerEntity.Id)
                   )?.Id;

My JSON is:

[
  {
    "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
        }
      }
    ],
    "id": "1000000000000"
  },
  {
    "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
        }
      }
    ],
    "id": "2000000000000"
  }
]
1 Answers

You can do this with a nested Any statement:

var employer = employers
    .SingleOrDefault(e => e.Sectors
        .Any(s => s.Learners
            .Any(l => l.LearnerId == 123)));

// Check for null just in case we didn't find a match
if(employer != null)
{
    var employerId = employer.Id;
}

Note that this will throw an exception if multiple employers match.

Related