使用Queryable.Join實現多表連接查詢

背景

今天處理一個問題時,遇到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個參數:

  名稱 說明
System_CAPS_pubmethodSystem_CAPS_static Join<TOuter, TInner, TKey, TResult>(IQueryable<TOuter>, IEnumerable<TInner>, Expression<Func<TOuter, TKey>>, Expression<Func<TInner, TKey>>, Expression<Func<TOuter, TInner, TResult>>)

基於匹配鍵對兩個序列的元素進行關聯。使用默認的相等比較器對鍵進行比較。

System_CAPS_pubmethodSystem_CAPS_static Join<TOuter, TInner, TKey, TResult>(IQueryable<TOuter>, IEnumerable<TInner>, Expression<Func<TOuter, TKey>>, Expression<Func<TInner, TKey>>, Expression<Func<TOuter, TInner, TResult>>, IEqualityComparer<TKey>)

基於匹配鍵對兩個序列的元素進行關聯。使用指定的IEqualityComparer<T> 對鍵進行比較。

每個參數具體能傳入一些什麼內容我也不完全理解,針對我這裏的使用,說明如下:

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


http://www.alanzeng.cn/2016/01/queryable-join/

發佈了94 篇原創文章 · 獲贊 39 · 訪問量 44萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章