關於linq的多表聯查效果的實現:
后台多表查詢 內連接:
SELECT
[Extent2].[partID] AS [partID],
[Extent1].[userName] AS [userName],
[Extent3].[partName] AS [partName]
FROM [dbo].[User] AS [Extent1]
INNER JOIN [dbo].[User_partB] AS [Extent2] ON [Extent1].[userGUID] = [Extent2].[userGUID]
INNER JOIN [dbo].[partB] AS [Extent3] ON [Extent2].[partID] = [Extent3].[partID]
數據庫數據效果展示:
代碼如下:
1 var userListTest = (from u in db.Users 2 join p in db.User_partB on u.userGUID 3 equals p.userGUID 4 join d in db.partBs on p.partID equals d.partID 5 select new { name = u.userName, departName = d.partName }); 6 List<dynamic> oneList = new List<dynamic>(); 7 foreach (var one in userListTest.ToList()) 8 { 9 dynamic dyObject = new ExpandoObject(); 10 dyObject.userName = one.name; 11 dyObject.departName = one.departName; 12 oneList.Add(dyObject); 13 } 14 ViewBag.dyObject = oneList; 15 return View();
前台數據展現效果:
1 <table> 2 <tr><td>用戶登錄名</td><td>姓名</td><td>狀態</td><td>角色</td><td>操作</td></tr> 3 @{foreach (var one in ViewBag.dyObject) 4 { 5 <tr> 6 @*<td>@one.userLoginName</td>*@ 7 <td>@one.userName</td> 8 @*<td>@one.active==1?"啟用":"禁用"</td>*@ 9 <td>@one.departName</td> 10 <td></td> 11 </tr> 12 } 13 } 14 </table>
linq 多表聯查 外鏈接:
SELECT
1 AS [C1],
[Extent1].[userName] AS [userName],
[Extent3].[partName] AS [partName]
FROM [dbo].[User] AS [Extent1]
LEFT OUTER JOIN [dbo].[User_partB] AS [Extent2] ON [Extent1].[userGUID] = [Extent2].[userGUID]
LEFT OUTER JOIN [dbo].[partB] AS [Extent3] ON [Extent2].[partID] = [Extent3].[partID]
數據庫數據展示效果:
代碼如下:
1 var userListTest = (from u in db.Users 2 join p in db.User_partB on u.userGUID 3 equals p.userGUID into temp 4 from t in temp.DefaultIfEmpty() 5 join d in db.partBs on t.partID equals d.partID 6 into tempone 7 from user in tempone.DefaultIfEmpty() 8 select new { name = u.userName, departName = user.partName }); 9 List<dynamic> oneList = new List<dynamic>(); 10 foreach (var one in userListTest.ToList()) 11 { 12 dynamic dyObject = new ExpandoObject(); 13 dyObject.userName = one.name; 14 dyObject.departName = one.departName; 15 oneList.Add(dyObject); 16 } 17 ViewBag.dyObject = oneList; 18 return View();
前台數據展示效果同上
上述過程中,遇到 延遲加載后的動態數據,TOList()之后,傳遞到前台后,在foreach循環時,無法通過對象.屬性的形式,讀取出來,報“OBJECT未定義該屬性”,經過查找原因發現,該動態數據為internal類型,只能同一程序集內訪問,找了若干方法,不太適用,當然,如果大家有好的建議,可以一起交流討論,究於當前場景,我選擇了ExpandoObject,來動態處理,linq的查詢結果。