2015-12-03 24 views
1

我想從SQL Server數據庫中獲取數據。如何在實體框架中使用連接使級別的輸出Json對象 - 不是相同的級別

數據庫有3個表如下所示:

enter image description here

中的表之間的相互關係用初級和外鍵:

  • HALAQATI_View_GetAllMosques(父)
  • HALAQATI_View_GetAllRings(兒童)
  • HALAQATI_View_GetAllStudents(Child Of 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 
     } 
    } 
    ] 
} 

的問題是,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 
      } 
      ] 
     } 
     ] 
    } 
    ] 
} 
+0

'選擇新{=將對msqid m.MSQ_ID,MsqName = m.MSQ_Name,戒指= R,學生= S})'除非戒指有一個學生的財產,你都明確地在同一水平環宣佈它,而不是作爲戒指的一個子對象。看起來你需要在你的LINQ中的某處進行內部選擇。 –

+0

@RonBeyer確切地說,這就是我想要的,我嘗試了很多,但沒有任何作品能夠告訴我們現在。你有解決方案嗎? – Loai

+0

也許這會幫助嗎? http://stackoverflow.com/questions/17841108/linq-select-within-a-select嘗試搜索「linq內部選擇」並閱讀一些答案,似乎有很多方法來做到這一點,而沒有像你的設置,我不能推薦一個好的方法來做到這一點。 –

回答

3

這大約是你所需要的模式。不要擔心自己在執行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 }; 
+0

謝謝,這就是我想要的。 – Loai

+0

如果我想使一個特性等於一個存儲過程,該怎麼辦。結果。 ? – Loai

相關問題