1. 程式人生 > >Linq連線兩個List列表 例項詳解(Linq inner join,left join)

Linq連線兩個List列表 例項詳解(Linq inner join,left join)

本章節主要介紹Linq的聯接運算,對兩個List< T >,分別 inner join 和 left join 聯接,以此為例,進行例項詳解,程式碼也是自己編寫,親測通過的,可以直接拿著當demo使用。

聯接是指將一個數據源物件與另一個數據源物件進行關聯和聯合操作。這兩個資料來源物件通過一個共同的值屬性進行關聯。

在聯接的過程中,可以使用兩個語法進行聯接,一種是直接使用查詢方法,另一種是使用查詢表示式,均可達到聯接的效果。

Linq Left Join 例項

inner join比較簡單,直接使用我 語法詳解中的語法就可以了。GroupJoin 左聯接 在此處給出例項

悄悄告訴你,直接貼上到編譯器中,可以直接執行哦~~~

 /// <summary>
 /// C#控制檯應用程式
 /// 學習Linq left join 使用
 /// author : by wys 
 /// </summary>

// 假裝 是一個 實體集
 public class TestLinq
 {
     public string Time { get; set; }

     public int Temp { get; set; }
     public int ID { get; set; }
 }

// 然後有兩個要聯接的集合,注意集合2缺了兩天的資料哦。
List<TestLinq> list1 = new List<TestLinq>(); List<TestLinq> list2 = new List<TestLinq>(); // 集合1 list1.Add(new TestLinq { Time = "20170016", Temp = 16 }); list1.Add(new TestLinq { Time = "20170015", Temp = 15 }); list1.Add(new TestLinq { Time = "20170014", Temp = 14 }); list1.Add(new
TestLinq { Time = "20170013", Temp = 13 }); list1.Add(new TestLinq { Time = "20170012", Temp = 12 }); //集合2 缺少兩天資料 list2.Add(new TestLinq { Time = "20170016", ID = 1 }); list2.Add(new TestLinq { Time = "20170015", ID = 2 }); list2.Add(new TestLinq { Time = "20170012", ID = 3 }); //最終目標: 我要將 集合2中的ID 屬性,嫁接到 集合1中 //使用查詢語句 var list = from left in list1 join right in list2 on left.Time equals right.Time into temp select new TestLinq { Time = left.Time, Temp = left.Temp, ID = temp.Select(t => t.ID).FirstOrDefault() }; //使用查詢方法,均可使用 //var list = list1.GroupJoin(list2, left => left.Time, right => right.Time, // (left, temp) => new TestLinq() // { // Time = left.Time, // Temp = left.Temp, // ID = temp.Select(t => t.ID).FirstOrDefault() // }); //檢視執行結果: foreach (var item in list) { Console.WriteLine("{0}----{1}-----{2}", item.Time, item.Temp, item.ID); }

Linq聯接語法

查詢方法 查詢表示式 語法說明
Join join… in… on …equals… 內部聯接。類似於T-SQL 中的inner join。
GroupJoin join…in…on…equals…into… 分組聯接,類似於T-SQL中的left join or right join,常用於返回“主鍵物件-外來鍵物件集合形式查詢。

Join

:(簡而言之,就是提取公共部分) 他根據鍵值選擇器函式聯接兩個資料集,只返回那些在另一個數據集中具有匹配項的物件並提取值對。

//使用查詢語句
var list = from T1 in dataSource1
                join T2 in dataSource2 on T1.ID equals T2.ID
                select new {Name = T1.Name,ID=T1.ID,NickName = T2.NickName};


//使用查詢方法
var list = dataSource1.Join(dataSource2,T1 => T1.ID,T2 => T2.ID, (T1,T2) => new {
        Name = T1.Name,
        ID=T1.ID,
        NickName = T2.NickName
});


//補充:結果沒有區別,習慣用那種就用那種。

這裡寫圖片描述

GroupJoin

: 結果序列是 將左側集合中元素 和右側資料集中的一個或多個匹配元素相關聯,如果在右側元素中找不到與左側元素資料集中元素相匹配的元素,則join子句會為該項產生一個空陣列。

//查詢表示式
var list  = from left in dataSource1  
                join right in dataSource2 on left.ID = right.ID into tempArray
                select new  {
                Name = left.Name,
                ID=left.ID,
                NickName = tempArray.select(t => t.NickName).FirstOrDefault()};


//此處的left,right 只是一個名字,方便你理解左右聯接,並不是關鍵字

//難點(個人理解):

  • 1、經多次除錯發現,每次查詢,實際將 right中 的匹配結果 放到了 tempArray 這個數組裡,然後聯接在一起。

  • 2、如果右側找不到左側的相關匹配,這時 tempArray 將為空,但是他仍然是一個數據集陣列,所以我們要選出相應的屬性,因為他是一個相關陣列,所以我們取了第一個。

  • 3、匹配結果如果有多個,此時 tempArray 是個多個實體集的陣列,所以我們可以直接進行 彙總計算,比如說 tempArray.Sum(t => t.price)

這裡寫圖片描述