背景
今天處理一個問題時,遇到EF Model中多表連接查詢的情況,於是學習了一下Queryable.Join()的用法。由於本人是Linq新手,很多地方都看不懂,只能依葫蘆畫瓢。
業務說明
1) 一個EF Model名爲Daks,對應的DbContext名爲DaksContext
2) 此處要進行Field表(Id, FieldName,...)和Reservoir表(Id, FieldId, Reservoir Code, FieldCode, Resource,... )的關聯查詢,Reservoir.FieldId是外鍵對應Field.Id
3) 將兩張表的部分列數據查詢出來放入實體類UpdatedReservoir中
代碼示例
DaksContext dc = new DaksContext(); List<UpdatedReservoir> toReservoirs = dc.Reservoirs .Join(dc.Fields, r => r.FieldId, f => f.Id, (r, f) => new UpdatedReservoir() { SqlServerFieldId = r.FieldCode, SqlServerReservoirCode = r.OriginalReservoirCode, SqlServerUniqueName = f.FieldName + "(" + r.ReservoirUnit + ")" + "(" + r.Resource + ")" }) .OrderBy(i => i.SqlServerUniqueName) .ToList();
代碼解釋
這裏Join()方法有4個參數:
每個參數具體能傳入一些什麼內容我也不完全理解,針對我這裏的使用,說明如下:
1) 首先使用dc.Reservoirs得到Reservoir表的集合
2) 再調用Join方法,
2.1) 第一個參數,傳入外連表Field表的集合
dc.Fields
2.2) 第二個參數,主表外鍵字段信息,這裏r是Reservoir表實例
r=>r.FieldId
2.3) 第三個參數,外連表字段信息,這裏f是Field表實例
f=>f.Id
2.4) 第四個參數,輸出結果,將兩張表中部分自動的信息封裝成UpdatedReservoir類
(r, f) => new UpdatedReservoir() { SqlServerFieldId = r.FieldCode, SqlServerReservoirCode = r.OriginalReservoirCode, SqlServerUniqueName = f.FieldName + "(" + r.ReservoirUnit + ")" + "(" + r.Resource + ")" }
3) 最後,設置排序規則,這裏是對輸出結果UpdatedReservoir類的自動進行排序,這裏i是UpdatedReservoir類實例
.OrderBy(i => i.SqlServerUniqueName) .ToList();
兩個參考鏈接
https://msdn.microsoft.com/zh-cn/library/system.linq.queryable.join(v=vs.110).aspx
http://www.ezineasp.net/post/C-Sharp-LINQ-Queryable-Join-Method-in-ASP-Net.aspx