C# 使用带连接的linq查询查询嵌套对象

C# 使用带连接的linq查询查询嵌套对象,c#,json.net,linq-to-objects,C#,Json.net,Linq To Objects,我从api获得以下json结构: { "event_instance": [ { "id": 55551244, "event_id": 11112, "name": "Brown Belt Karate Class", "staff_members": [ { "id": 12345,

我从api获得以下json结构:

    {
    "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; }
    }
上面的工作很好,为我提供了上述json结构的精确对象表示。现在我尝试查询这个事件对象,以筛选/投影到一个新的结构,然后将其序列化回json并发送到浏览器。我需要返回事件中处于“已完成”状态和“已完成”状态的学生列表。如您所见,people数组与visits数组关联(带有id和person_id)。我希望生成以下简单输出:

  • 11112,布朗带空手道班,约翰·史密斯,111,无名氏
  • 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返回一个学生,以及此事件的根数据。任何关于更好的方法的建议都非常感谢

    诀窍是将学生和访问加入一个包含以下两方面数据的集合:

    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
    }
    

    啊,现在说得通了。林克需要一些时间来适应。谢谢
    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
    }