2016-08-23 18 views
1

I持って、私は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はvisits配列(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