對於昨天的連接還有一個知識點沒有說,那就是分組連接。是11.5中的內容,補上。
分組連接的格式:join 元素 in 序列
on 條件表達式
into 新的序列
內連接和分組連接之間的一個重要差異(即分組連接和普通分組之間的差異)是,對於分組連接來說,在左邊序列和結果序列之間是一對一的對應關系,即使左邊序列中的某些元素在右邊序列沒有任何匹配的元素,也無所謂。這是非常重要的,有時會用於模擬SQL的左外連接。在左邊元素不匹配任何右邊元素的時候,嵌入序列就是空的。與內連接一樣,分組連接要對右邊序列進行緩沖,而對左邊序列進行流處理。看代碼吧。
1 //使用分組連接 2 var result7 = from box in boxList 3 join item in list on box.jewelleryType equals item.Type into items 4 select new { box, items }; 5 //使用分組連接給我的感覺就好像將一系列的珠寶(具有相同屬性值),進行打包,當然生成的也是一個序列,而上 6 //述中的box則作為存放這些一些相同屬性珠寶的標識 7 Console.WriteLine(result7.Count()); 8 9 foreach (var re in result7) 10 { 11 Console.WriteLine(re.box.BoxName); 12 foreach (var item in re.items) 13 { 14 Console.WriteLine(item.Price); 15 } 16 }
這裡的代碼是接著昨天的代碼的,哈哈,可能要看看上一篇文章。
到目前為止,我們學到的連接都是相等連接--左邊序列中的元素和右邊序列要進行匹配。交叉連接不在序列之間執行任何匹配操作,它只盡可能列出所有的可能。我們新建一個類,叫Customer
1 class Customer 2 { 3 public string Name { get; set; } 4 }
1 List<Jewellery> list = new List<Jewellery>() 2 { 3 new Jewellery() {Type=Jewellery.JewelleryType.Bracelet,State=Jewellery.JewelleryState.Repair,Price=100 }, 4 new Jewellery() {Type=Jewellery.JewelleryType.Necklace,State=Jewellery.JewelleryState.Sold,Price=200 }, 5 new Jewellery() {Type=Jewellery.JewelleryType.Ring,State=Jewellery.JewelleryState.Stock,Price=300 }, 6 new Jewellery() {Type=Jewellery.JewelleryType.Necklace,State=Jewellery.JewelleryState.Sold,Price=400 }, 7 new Jewellery() {Type=Jewellery.JewelleryType.Bracelet,State=Jewellery.JewelleryState.Stock,Price=500 }, 8 new Jewellery() {Type=Jewellery.JewelleryType.Ring,State=Jewellery.JewelleryState.Repair,Price=600 } 9 }; 10 11 List<Customer> ctrList = new List<Customer>() 12 { 13 new Customer() {Name="111" }, 14 new Customer() {Name="222" }, 15 new Customer() {Name="333" }, 16 new Customer() {Name="444" }, 17 new Customer() {Name="555" } 18 }; 19 20 var result9 = from ctr in ctrList 21 from jly in list 22 select new { ctr, jly }; 23 Console.WriteLine(result9.Count());
結果為30,因為珠寶有6件,顧客有5人,5*6=30。可見,使用兩個from子句可能交叉連接返回所有組合的序列。
格式:group 元素 by 關鍵字
grouping表達式通過其鍵來決定序列如何分組。整個結果是一個序列,序列中的每個元素本身就是投影後元素的序列,還具有一個Key屬性,即用於分組的鍵。下面來做一個操作,用珠寶的類型進行分組。
1 var result10 = from jly in list 2 group jly by jly.Type; 3 4 Console.WriteLine(result10.Count()); 5 6 foreach (var jlys in result10) 7 { 8 Console.WriteLine(jlys.Key); 9 foreach(var jly in jlys) 10 { 11 Console.WriteLine(jly.Price); 12 } 13 }
感覺和使用join...into子句出來的效果是一樣的,但是使用group...by更能讓人理解。
查詢延續提供了一種方式,把一個查詢表達式的結果用作另一個查詢表達式的初始序列。它可以應用於group..by和select子句上,語法對於兩者是一樣的,只需要使用上下文關鍵字into,如要查詢每種類型珠寶的數量,可以這樣表示。
1 var result11 = from jly in list 2 group jly by jly.Type into jlys 3 select new { Type = jlys.Key, Count = jlys.Count() }; 4 5 foreach(var item in result11) 6 { 7 Console.WriteLine(item.Type); 8 Console.WriteLine(item.Count); 9 }
結果為:
表明每一種類型都有兩件珠寶。
對於如何選擇,每個心中都有數,這裡只說下兩者的關系。
每個查詢表達式都可能使用擴展方法來表示,但很多LING操作在C#中不存在等價的查詢表達式。
請斧正,抱一個學習的心態認真地做一件事情。