2016-08-23 109 views
1

我有我从API得到以下JSON结构:查询使用LINQ查询嵌套对象与加盟

{ 
    "event_instance": [ 
     { 
      "id": 55551244, 
      "event_id": 11112, 
      "name": "Brown Belt Karate Class", 
      "staff_members": [ 
       { 
        "id": 12345, 
        "name": "John Smith" 
       } 

      ], 

      "people": [ 
       { 
        "id": 111, 
        "name": "Jane Doe" 
       }, 
       { 
        "id": 222, 
        "name": "Josh Smith" 

       }, 
       { 
        "id": 333, 
        "name": "Ben Johnson" 
       } 

      ], 
      "visits": [ 
       { 
        "id": 1234578, 
        "person_id": 111, 
        "state": "completed", 
        "status": "complete" 
       }, 
       { 
        "id": 1239865, 
        "person_id": 222, 
        "state": "completed", 
        "status": "complete" 
       }, 
       { 
        "id": 1239865, 
        "person_id": 333, 
        "state": "canceled", 
        "status": "cancel" 
       } 
      ] 
     } 
    ] 
} 

我使用JSON.NET反序列化到下面的.NET对象是:

[JsonObjectAttribute("event_instance")] 
    public class EventInstance 
    { 
     [JsonPropertyAttribute("id")] 
     public int Id { get; set; } 

     [JsonPropertyAttribute("event_id")] 
     public int EventId { get; set; } 

     [JsonPropertyAttribute("name")] 
     public string Name { get; set; } 

     [JsonPropertyAttribute("staff_members")] 
     public List<StaffMember> StaffMembers { get; set; } 

     [JsonPropertyAttribute("visits")] 
     public List<Visit> Visits { get; set; } 

     [JsonPropertyAttribute("people")] 
     public List<Student> Students { get; set; } 
    } 

    [JsonObjectAttribute("staff_members")] 
    public class StaffMember 
    { 
     [JsonPropertyAttribute("id")] 
     public int Id { get; set; } 
     [JsonPropertyAttribute("name")] 
     public string Name { get; set; } 
    } 

    [JsonObjectAttribute("people")] 
    public class People 
    { 
     [JsonPropertyAttribute("id")] 
     public int Id { get; set; } 
     [JsonPropertyAttribute("name")] 
     public string Name { get; set; } 
    } 

    [JsonObjectAttribute("visits")] 
    public class Visits 
    { 
     [JsonPropertyAttribute("id")] 
     public int Id { get; set; } 
     [JsonPropertyAttribute("person_id")] 
     public int PersonId { get; set; } 
     [JsonPropertyAttribute("state")] 
     public string State { get; set; } 
     [JsonPropertyAttribute("status")] 
     public string Status { get; set; } 
    } 

我使用下面的代码反序列化:

var event = (EventInstance)JsonConvert.DeserializeObject(json, typeof(EventInstance)); 

以上工作正常,并给了我上述json结构的精确对象表示。现在我试图查询这个事件对象来过滤/项目到一个新的结构,然后我可以序列化回json并发送到浏览器。我需要返回处于“已完成”状态和“完成”状态的活动的学生列表。正如你所看到的,people数组绑定到访问数组(使用id和person_id)。我想产生以下简单的输出:

  1. 11112,棕带空手道班,约翰·史密斯,111,李四
  2. 11112,棕带空手道班,约翰·史密斯,222,约什 - 史密斯

我已经试过这样的事情:

var studentList = from theClass in event 
        from staff in theClass.StaffMembers 
        from student in theClass.People 
        from visits in theClass.Visits 
        where visits.Status == "complete" 
        && visits.State == "completed" 
          select new 
          { 
           event_id = theClass.EventId 
           class_name = theClass.Name, 
           instructor_name = staff.Name, 
           student_id = student.Id, 
           student_name = student.Name 
          }; 



string _data = JsonConvert.SerializeObject(studentList); 

当然,这会产生重复的学生姓名。我是linq新手。基本上,我需要加入/绑定人员并访问数组,以便为​​该ID返回单个学生以及该事件的根数据。任何建议,以更好的方式来做到这一点非常赞赏!

回答

1

关键是要参加的学生和访问到包含两个数据集合:

from ei in eventInstances 
from sm in ei.StaffMembers 
from x in 
(from vi in ei.Visits 
join st in ei.Students on vi.PersonId equals st.Id 
select new { vi, st }) // Here you get students and visits side-by-side 
select new 
{ 
    ei.EventId, 
    Event = ei.Name, 
    StaffMemeber = sm.Name, 
    PersonId = x.st.Id, 
    Student = x.st.Name 
} 
+0

啊,现在是有道理的。 Linq需要一些时间才能习惯。谢谢!! – MattoMK