希望根据 属性 和列表中的值查询对象列表

Looking to query a list of objects based on a property and value in list

我将以下 JSON 放入对象列表中。每个对象都有一个 属性 和一个代码列表。我正在努力寻找一种方法来查询列表以查找特定公司的特定代码值。我最终是在寻找基于 Company/PayCode 的“AbsenceType”值。 这是我试图查看的内容,但没有用。寻找任何建议。

companyAbsenceType = AbsenceCodesList.First(c => 
    (c.Company == companyCode) && (c.Codes.Find(x => x.PayCode == ppc.PayCode));

companyAbsenceType = AbsenceCodesList.Select(c =>
   c.Company == companyCode && c.Codes.Find(x => x.PayCode == ppc.PayCode)).FirstOrDefault();

JSON:

[
  {
    "Company": "Company1",
    "Codes": [
      {
        "PayCode": "SCK",
        "AbsenceType": "Illness"
      },
      {
        "PayCode": "VAC",
        "AbsenceType": "Vacation"
      },
      {
        "PayCode": "BRV",
        "AbsenceType": "Bereavement"
      },
      {
        "PayCode": "JUR",
        "AbsenceType": "Jury Duty"
      },
      {
        "PayCode": "PER",
        "AbsenceType": "Personal"
      }
    ]
  },
  {
    "Company": " Company2",
    "Codes": [
      {
        "PayCode": "SCK",
        "AbsenceType": "Sick"
      },
      {
        "PayCode": "VAC",
        "AbsenceType": "Vacation"
      },
      {
        "PayCode": "BRV",
        "AbsenceType": "Bereavement"
      },
      {
        "PayCode": "JUR",
        "AbsenceType": "Jury Duty"
      },
      {
        "PayCode": "PER",
        "AbsenceType": "Personal"
      },
      {
        "PayCode": "PRNU",
        "AbsenceType": "Personal"
      }
    ]
  }
]

public class AbsenceCodes
    {
        public string Company { get; set; }
        public List<AbsenceCode> Codes { get; set; }
    }
public class AbsenceCode
    {
        public string PayCode { get; set; }
        public string AbsenceType { get; set; }
    }

更新 感谢 Moho 和 Eric Magers 向我指出了一个问题。来自 Moho 的查询有效。

var absenceType = AbsenceCodesList.FirstOrDefault(c => c.Company == companyCode && c.Codes.Any(x => x.PayCode == ppc.PayCode)) ? .Codes.First(c => c.PayCode == ppc.PayCode) ?.AbsenceType;

你很接近,过滤时使用 .Any 而不是 .Find 作为 Codes

var absenceType = AbsenceCodesList
    // first find a valid top level item
    .FirstOrDefault(c => 
        // is specific company
        c.Company == companyCode
        // has the target paycode
        && c.Codes.Any(x => x.PayCode == ppc.PayCode))

    // then select the desired value
    ?.Codes.First(c => c.PayCode == ppc.PayCode)
    .AbsenceType;