如何在Entity Framework中使用join在级别中制作输出Json对象 - 不是同一级别

Loa*_*oai 1 c# json entity-framework nested asp.net-web-api

我正在尝试从 SQL Server 数据库中获取数据。

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

在此处输入图片说明

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

  • HALAQATI_View_GetAllMosques(父)
  • HALAQATI_View_GetAllRings(儿童)
  • HALAQATI_View_GetAllStudents(孩子的孩子)

代码:

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 };  
Run Code Online (Sandbox Code Playgroud)

输出显示如下

{
  "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
      }
    }
  ]
}  
Run Code Online (Sandbox Code Playgroud)

问题是RingsAndStudents在 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
            }
          ]
        }
      ]
    }
  ]
}
Run Code Online (Sandbox Code Playgroud)

Str*_*ior 5

这大致是您需要的模式。不要担心自己执行 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 };  
Run Code Online (Sandbox Code Playgroud)