如何使用 join in Entity Framework 使输出 Json objects 级别 - 不是同一级别

How to use join in Entity Framework to make output Json objects in levels - not the same level

我正在尝试从 SQL 服务器数据库中获取数据。

数据库有 3 个表,如下所示:

这些表使用主键和外键相互关联:

代码:

var result = (from m in db.HALAQATI_VIEW_GetAllMosques
     join r in db.HALAQATI_VIEW_GetAllRings on m.MSQ_ID equals r.MSQ_ID
     join s in db.HALAQATI_VIEW_GetAllStudents on r.Ring_ID equals s.Ring_ID
     where m.Emp_ID == r.Emp_ID && m.Emp_ID == id
     select new { MsqID = m.MSQ_ID, MsqName = m.MSQ_Name, Rings = r,Students = s}).Distinct();
return new { Mosques = result };  

输出结果如下

{
  "Mosques": [
    {
      "MsqID": 186,
      "MsqName": "UNIVERSITY 1",
      "Rings": {
        "Ring_ID": 3730,
        "Ring_Name": "Class 1",
        "MSQ_ID": 186,
        "Emp_ID": 3750
      },
      "Students": {
        "Student_ID": 80065,
        "Student_Name": "Student 1",
        "Ring_ID": 3730
      }
    }
  ]
}  

问题是 RingsStudents 在 Json 中出现在同一层,这是错误的。

students 必须在 Rings 之下。

预期的结果一定是这样的:

{
  "Mosques": [
    {
      "MsqID": 186,
      "MsqName": "UNIVERSITY 1",
      "Rings": [
        {
          "Ring_ID": 3730,
          "Ring_Name": "Class 1",
          "MSQ_ID": 186,
          "Emp_ID": 3750,
          "Students": [
            {
              "Student_ID": 80065,
              "Student_Name": "Student 1",
              "Ring_ID": 3730
            }
          ]
        }
      ]
    }
  ]
}

这大致就是您需要的模式。不要担心自己执行 JOIN:让框架负责连接表,同时您考虑要查找的数据的形状。

var result = 
     from m in db.HALAQATI_VIEW_GetAllMosques
     where m.Emp_ID == id
     select new {
         MsqID = m.MSQ_ID,
         MsqName = m.MSQ_Name, 
         Rings = from r in db.HALAQATI_VIEW_GetAllRings
             where m.MSQ_ID == r.MSQ_ID
             where m.Emp_ID == r.Emp_ID  // is this even necessary?
             select new {
                 r.Ring_ID,
                 ...
                 Students = from s in db.HALAQATI_VIEW_GetAllStudents
                     where r.Ring_ID == s.Ring_ID
                     select s
             }
     };
return new { Mosques = result };