【问题标题】:How to search through children JSON with LINQ如何使用 LINQ 搜索子 JSON
【发布时间】:2017-05-11 17:33:39
【问题描述】:

我有以下 JSON

[
  {
    "id": 1,
    "firstName": "Smith",
    "lastName": "Bill",
    "emails": [
      {
        "id": 1,
        "email": "Bill@Smith.Com",
        "dateCreated": "2017-05-11T10:18:52.3224545-07:00"
      },
      {
        "id": 2,
        "email": "Bill@gmail.com",
        "dateCreated": "2017-05-11T10:20:05.9283127-07:00"
      }
    ]
  },
  {
    "id": 2,
    "firstName": "Bill",
    "lastName": "Smith",
    "emails": []
  }
]

电子邮件模型对象在人体内。

我想知道如何使用 LINQ 语句将所有电子邮件与某些输入相匹配的人返回给我。比如我搜索“Bill@gmail.com”,它只会返回

[
      {
        "id": 1,
        "firstName": "Smith",
        "lastName": "Bill",
        "emails": [
          {
            "id": 1,
            "email": "Bill@Smith.Com",
            "dateCreated": "2017-05-11T10:18:52.3224545-07:00"
          },
          {
            "id": 2,
            "email": "Bill@gmail.com",
            "dateCreated": "2017-05-11T10:20:05.9283127-07:00"
          }
        ]
      }  
    ]

应该如下所示?

var personWithEmail = People.FirstOrDefault(e => e.Id == i);

除了这只是查找具有某些 ID 的人,而我想深入了解他们孩子的电子邮件并搜索电子邮件是否匹配。

【问题讨论】:

  • 您尝试了如何访问子属性?你走在正确的轨道上,答案并不远。

标签: c# json asp.net-mvc linq asp.net-web-api


【解决方案1】:

假设PeoplePerson 的集合

在哪里

public class People : Collection<Person> {  }

public class Person {
    public int id { get; set; }
    public string firstName { get; set; }
    public string lastName { get; set; }
    public IList<Email> emails { get; set; }
}

public class Email {
    public int id { get; set; }
    public string email { get; set; }
    public DateTime dateCreated { get; set; }
}

钻取子属性。

var email = "Bill@gmail.com";
var people = JsonConvert.DeserializeObjecct<People>(json);
var peopleWithEmail = people.Where(p => p.emails.Any(e => e.email == email));

【讨论】:

    【解决方案2】:

    在列表中添加另一个示例:

    string input = "Bill@gmail.com";
    List<Peeps> tmp = JsonConvert.DeserializeObject<List<Peeps>>(json);
    //returns the base object
    var test = tmp.Where(a => a.emails.Any(b => b.email == input));
    //returns only the email object
    var testDuece = tmp.Where(a => a.emails.Any(b => b.email == input)).Select(c => c.emails.Where(a => a.email == input));
    
    
    
    public class Peeps
    {
        public int id { get; set; }
        public string firstName { get; set; }
        public string lastName { get; set; }
        public List<Emails> emails { get; set; }
    }
    
    public class Emails
    {
        public int id { get; set; }
        public string email { get; set; }
        public string dateCreated { get; set; }
    }
    

    【讨论】:

      猜你喜欢
      • 2013-10-22
      • 2014-08-27
      • 1970-01-01
      • 2011-10-27
      • 2016-06-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多