1. 程式人生 > >LINQ使用連線(1、組連線 2、內連線 3、左外連線 4、交叉連線)

LINQ使用連線(1、組連線 2、內連線 3、左外連線 4、交叉連線)

首先呢,今天在資料庫中寫好了笛卡爾連線,後面要改寫成LINQ的方式。突然瞬間蒙了,寫多了JOIN卻忘了怎麼去寫交叉連線(笛卡爾連線)。

順便複習一下LINQ的連線操作:

static public class SampleData
    {
        static public Student[] Students =
        {
          new Student {Name="Richard"},
          new Student {Name="Joe"},
          new Student {Name="Tom"}
        };

        static public Subject[] Subjects =
        {
          new Subject {Name="語文"},
          new Subject {Name="數學"},
          new Subject {Name="英語"}
        };
        static public Book[] Books =
        {
          new Book {
            Title="人教版語文",
            PublicationDate=new DateTime(2004, 11, 10),
            Subject=Subjects[0]
          },
          new Book {
            Title="蘇教版語文",       
            PublicationDate=new DateTime(2007, 9, 2),
            Subject=Subjects[0]
          },
          new Book {
            Title="人教版數學",
            PublicationDate=new DateTime(2007, 4, 1),
            Subject=Subjects[1]
          },
          new Book {
            Title="人教版英語",
            PublicationDate=new DateTime(2006, 5, 5),
            Subject=Subjects[2]
          },
          new Book {
            Title="蘇教版數學",
            PublicationDate=new DateTime(1973, 2, 18),
            Subject=Subjects[1]
          }
        };
    }

1、組連線組連線是與分組查詢是一樣的。即根據分組得到結果。 如下例,根據Subject科目進行分組得到結果。使用組連線的查詢語句如下:

var query = from sub in SampleData.Subjects
                        join book in SampleData.Books on sub equals book.Subject into AllBooks
                        select new { Subject = sub.Name, Books = AllBooks };

上述程式碼就是所謂的“組連線”。它將每個出版社的科目分組為AllBooks,並繫結到了一起。這段程式碼與下面程式碼執行結果一致。

var x = from book in SampleData.Books
                    group book by book.Subject
                    into AllBooks
                    select new { Subject = AllBooks.Key.Name, books = AllBooks };		

2、內連線
    內連線與SqL中inner join一樣,即找出兩個序列的交集。如下例找出book中的Subject存在於SampleData.Subjects的資料。內連線查詢語句如下:

var query = from sub in SampleData.Subjects
	  join book in SampleData.Books on sub equals book.Subject
	  select new { subject=sub.Name, Book=book.Title };

內連線旨在找到兩個序列的交集。經過內連線操作之後,滿足指定條件且分別來自兩個序列中的元素將被組合到一起,形成一個新的序列。Join操作符將基於元素中的Key的匹配情況,實現內連線。

3、左外連線
  在內連線中,只有在兩個待連線序列中均符合條件的組合才會出現在結果序列中。不過若是需要保留外部序列中的所有元素,而不管其是否有與之對應的、符合條件的內部序列元素存在,那麼我們則要執行 左外連線  操作。

var query = from sub in SampleData.Subjects
		  join book in SampleData.Books on sub equals book.Subject into AllBooks
		  from book in AllBooks.DefaultIfEmpty()
		  select new {
			subject = sub.Name,
			Book = book == default(Book) ? "(no books)" : book.Title
		  };

DefaultIfEmpty()能夠為空序列提供一個預設的元素。DefaultIfEmpty使用到了泛型的default關鍵詞,對於引用型別將返回null,而對於值型別將返回0。對於結構體型別,則會根據其成員型別將他們對應的初始化為null或者0.
4、交叉連線
  交叉連線將計算出兩個序列中所有元素的笛卡爾積。結果序列將由一個序列中的每個元素和另一個序列中的每個元素的完全組合構成。結果序列中的元素的個數為兩個源序列中的元素個數的積。
  LINQ中的交叉連線並不是通過Join操作符實現的。在linq的術語中,交叉連線是指一類投影操作,可以通過SelectMany操作符或在查詢表示式中使用多個from子句來實現。

var query = from stu in SampleData.Students
		  from book in SampleData.Books
		  select new {
			Student = stu.Name,
			BookName = book.Title
		  };
var query = SampleData.Students.SelectMany(stu => SampleData.Books.Select(
                            book => new
                            {
                                Student = stu.Name,
                                BookName = book.Title
                            }
                            ));


相關推薦

使用js控制表單重複提交1加鎖,2事件方式,3 EasyUI中解決表單重複提交

方法一、var flag = true; $(function() { $("#interested").click(function() { beInterested(); }); }); function beInterested() { //$("#inte

常用的標簽1.標題標簽 2 段落標簽3 換行標簽4水平線標簽

ima inf 段落 技術 9.png 圖片 http 標題 bsp 1、 2 3 4 常用的標簽1.標題標簽 2 段落標簽3 換行標簽4水平線標簽

LINQ使用連線1連線 2連線 3連線 4交叉連線

首先呢,今天在資料庫中寫好了笛卡爾連線,後面要改寫成LINQ的方式。突然瞬間蒙了,寫多了JOIN卻忘了怎麼去寫交叉連線(笛卡爾連線)。 順便複習一下LINQ的連線操作: static public class SampleData { static

1400統計單詞數 noip2011普及2

統計單詞 etl space name main turn cin iostream pre 1 #include<cstdio> 2 #include<cstring> 3 #include<iostream> 4 #incl

數據結構四十四插入排序1.直接插入排序 2.希爾排序

結束 縮小 移動 個數 數據 空間 分析 過程 只有一個   一、插入排序的基本思想   從初始有序的子集合開始,不斷地把新的數據元素插入到已排列有序子集合的合適位置上,使子集合中數據元素的個數不斷增多,當子集合等於集合時,插入排序算法結束。常用的 插入排序算法有直接插入排

位運算1的個數;2.判斷奇偶

奇數 判斷 其它 str 與運算 符號 奇偶性 進制 number 1. 1的個數 int NumberOf1(int n){ int count = 0; while(n) { ++count; n=(n-1)&n; } } 同樣

某月天數問題1.if語句實現 2.二維陣列實現c++

【題目描述】 從鍵盤輸入某年某月,程式設計輸出該年的該月擁有的天數 【題目難點】 閏年定義: (1)能被4整除,卻不能被100整除 (2)能被400整除 程式碼1:(用if簡單語句來完成) #include <iostream> using na

luogu1981 表示式求值NOIP2013普及2

時空限制    1000ms/128MB 題目描述 給定一個只包含加法和乘法的算術表示式,請你程式設計計算表示式的值。 輸入輸出格式 輸入格式: 一行,為需要你計算的表示式,表示式中只包含數字、加法運算子“+”和乘法運算子“×”,且沒有括號,所有參與運算的數字均

3.條件變數1.互斥鎖;2,讀寫鎖

先介紹幾個api: pthread_cond_t表示多執行緒的條件變數,用於控制執行緒等待和就緒的條件。 一:條件變數的初始化: 條件變數和互斥鎖一樣,都有靜態動態兩種建立方式, 靜態方式使用PTHREAD_COND_INITIALIZER常量初始化。 pthread_cond_

程式設計師可能會遇到的問題:工作了一段時間了,面臨你的只有兩條路1.繼續走下去2.被淘汰掉

從2015年開始到現在,我也已經工作了一個半年頭了,說一下現在我工作了這麼長時間的感悟吧。作為一個android開發工程師,我之前做過安卓但是還做過一段java,都說java是安卓的基礎,這個應該算是正常的。但是,我想說的我先做的是安卓,後做的是java。這是為什麼呢?這是

luogu1068 分數線劃定NOIP2009普及2

題目描述世博會志願者的選拔工作正在 A 市如火如荼的進行。為了選拔最合適的人才,A 市對所有報名的選手進行了筆試,筆試分數達到面試分數線的選手方可進入面試。面試分數線根據計劃錄取人數的150%劃定,即如果計劃錄取m名志願者,則面試分數線為排名第m*150%(向下取整)名的選手的分數,而最終進入面試的選手為筆試

洛谷網課day1習題題解1.Peter的煙 2.數字統計 3.金幣金幣將單獨發題解

Peter的煙程式碼及講解:#include<cstdio> #include<iostream> using namespace std; int main() { int n,k; /*ans用來儲存問題答案(Peter抽過的煙),b用來儲存P

codeup27968 方陣填數NOIP1995普及2

時空限制    1000ms/128MB 題目描述 在一個N*N的方陣中,填入1,2,……N*N個數,並要求構成如下的格式: 例如: N=5 13 14 15 16 1 12 23 24 17 2 11 22 25 18 3 10 21 20 19 4 9 8 7 6

8.1 shell介紹 8.2 命令歷史 8.3 命令補全和別名 8.4 通配符 8.5 輸入輸出重定向

8.1 shell介紹 8.2 命令歷史 8.3 命令補全和別名 8.4 通配符 8.5 輸入輸出重定向8.1 shell介紹 8.2 命令歷史 8.3 命令補全和別名 8.4 通配符 8.5 輸入輸出重定向 # Linux shell 基礎 # 8.1 shell 介紹 - 什麽是shell 1

16.1 Tomcat介紹 - 16.2 安裝jdk - 16.3 安裝Tomcat

16.1 tomcat介紹 - 16.2 安裝jdk - 16.3 安裝tomcat16.1 Tomcat介紹16.2 安裝jdk16.3 安裝Tomcat擴展java容器比較 http://my.oschina.net/diedai/blog/271367http://www.360doc.com/cont

21.1 nosql介紹 21.2 memrcached介紹 21.3 安裝memcached 21

21.1 nosql介紹 21.2 me21.1NoSQL介紹什麽是NoSQL非關系型數據庫就是NoSQL,關系型數據庫代表MySQL 對於關系型數據庫來說,是需要把數據存儲到庫、表、行、字段裏,查詢的時候根據條件一行一行地去匹配,當量非常大的時候就很耗費時間和資源,尤其是數據是需要從磁盤裏去檢索NoSQL數

8.1 shell介紹 8.2 命令歷史 8.3 命令補全和別名 8.4 通配符 8.5 輸入輸出重

輸出 一個 路徑 strong 簡單 local 如果 一次 command 8.1 shell介紹 shell是系統跟計算機硬件交互時使用的中間介質,它只是系統的一個工具。用戶直接面對的不是計算機硬件而是shell,用戶把指令告訴shell,然後shell再傳輸給系統內核

16.1 Tomcat介紹 16.2 安裝jdk 16.3 安裝Tomcat

16.1 Tomcat介紹 16.2 安16.1 Tomcat介紹 16.2 安裝jdk 16.3 安裝Tomcat 擴展java容器比較 http://my.oschina.net/diedai/blog/271367 http://www.360doc.com/content/11/0618/2

並發編程 - 協程 - 1.協程概念/2.greenlet模塊/3.gevent模塊/4.gevent實現並發的套接字通信

() 原理 utf-8 計算 幫我 error rec sum spa 1.協程並發:切+保存狀態單線程下實現並發:協程 切+ 保存狀態 yield 遇到io切,提高效率 遇到計算切,並沒有提高效率 檢測單線程下 IO行為 io阻塞 切 相當於

五周第三次課 8.1 shell介紹 8.2 命令歷史 8.3 命令補全和別名 8.4 通配符 8.

學習 打卡8.1 shell介紹8.2 命令歷史8.3 命令補全和別名8.4 通配符8.5 輸入輸出重定向 8.1 shell介紹 shell是一個命令解釋器,提供用戶和機器之間的交互支持特定語法,比如邏輯判斷、循環(if for whell)每個用戶都可以有自己特定的shellCentOS7默認shel