如何使用 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 个表,如下所示:
这些表使用主键和外键相互关联:
- HALAQATI_View_GetAllMosques (Parent)
- HALAQATI_View_GetAllRings (Child)
- HALAQATI_View_GetAllStudents(Child 的 Child)
代码:
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
}
}
]
}
问题是 Rings
和 Students
在 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 };
我正在尝试从 SQL 服务器数据库中获取数据。
数据库有 3 个表,如下所示:
这些表使用主键和外键相互关联:
- HALAQATI_View_GetAllMosques (Parent)
- HALAQATI_View_GetAllRings (Child)
- HALAQATI_View_GetAllStudents(Child 的 Child)
代码:
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
}
}
]
}
问题是 Rings
和 Students
在 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 };