C#Linq在嵌套数组对象中查找特定项目 [英] C# Linq find particular item in nested array object

查看:123
本文介绍了C#Linq在嵌套数组对象中查找特定项目的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在使用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 (or Single 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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆