1. 程式人生 > >Linq to EF 內連線和左外連線

Linq to EF 內連線和左外連線

Linq中連線主要有組連線、內連線、左外連線、交叉連線四種。本文主要講解沒連線和左外連線。

本次使用到的資料實體模型具體的建立方法不再累述。該實體模型中包括Student、Course兩個表,他們之間是一對多的關係。

一、內連線

 內連線與SqL中inner join一樣,即找出兩個序列的交集

           Model1Container model = new Model1Container();
            //內連線
            var query = from s in model.Student
                        join c in model.Course on s.CourseCno equals c.Cno
                        where c.Cno == 1
                        select new
                        {
                            ClassID = s.CourseCno,
                            ClassName = c.Cname,
                            Student = new
                            {
                                Name = s.Sname,
                                ID = s.Sno
                            }
                        };
            foreach (var item in query)
            {
                Response.Write("ClassID:" + item.ClassID + "ClassName:" + item.ClassName + "Name:" + item.Student.Name);
            }


與上面的內連線語句相對應的SQL指令碼語言如下所示:

SELECT [t0].[CourseCno] AS [ClassID], [t1].[Cname] AS [ClassName], [t0].[Sname] AS [Name], [t0].[Sno] AS [ID]
FROM [Student] AS [t0]
INNER JOIN [Course] AS [t1] ON [t0].[CourseCno] = [t1].[Cno]
WHERE [t1].[Cno] = @p0

二、左外連線

左外連線與SqL中left join一樣

            Model1Container model = new Model1Container();
            var query = from s in model.Student
                        join c in model.Course on s.CourseCno equals c.Cno into gc
                        from gci in gc.DefaultIfEmpty()
                        select new
                        {
                            ClassID = s.CourseCno,
                            ClassName = gci.Cname,
                            Student = new
                            {
                                Name = s.Sname,
                                ID = s.Sno
                            }
                        };
            //Outer join時必須將join後的表into到一個新的變數gc中,然後要用gc.DefaultIfEmpty()表示外連線。
            foreach (var item in query)
            {
                Response.Write("ClassID:" + item.ClassID + "ClassName:" + item.ClassName + "Name:" + item.Student.Name);
            }

注:上例中使用了DefaultIfEmpty操作符,它能夠為實序列提供一個預設的元素。DefaultIfEmpty使用了泛型中的default關鍵字。default關鍵字對於引用型別將返回null,而對於值型別則返回0。對於結構體型別,則會根據其成員型別將它們相應地初始化為null(引用型別)或0(值型別)

我們可以不使用default關鍵字,但在要DefaultIfEmpty中給定當空時的預設物件值。語句如下:

            //left join, 為空時使用預設物件
            var leftJoinQuery = from s in model.Student
                                join c in model.Course
                                on s.CourseCno equals c.Cno into gc
                                from gci in gc.DefaultIfEmpty(
                                new Course { Cname = "",Cperiod="" }     //設定為空時的預設值
                                )
                                select new
                                {
                                    ClassID = s.CourseCno,
                                    ClassName = gci.Cname,
                                };

與上面的左外連線語句相對應的SQL指令碼語言如下所示:

SELECT [t0].[CourseCno] AS [ClassID], [t1].[Cname] AS [ClassName], [t0].[Sname] AS [Name], [t0].[Sno] AS [ID]
FROM [Student] AS [t0]
LEFT OUTER JOIN [Course] AS [t1] ON [t0].[CourseCno] = [t1].[Cno]

當然也可以通過LinqPad工具檢視上面的左外連線語句的Lamada表示式,在此不再累述。

以上是自己學習時的一點見解,不對之處請拍磚指教。

 

相關推薦

Linq to EF 連線連線

Linq中連線主要有組連線、內連線、左外連線、交叉連線四種。本文主要講解沒連線和左外連線。 本次使用到的資料實體模型具體的建立方法不再累述。該實體模型中包括Student、Course兩個表,他們之間是一對多的關係。 一、內連線  內連線與SqL中inner j

Hibernate中的迫切連線連線

  前邊我們講過了Hibernate的檢索方式及它的四個細節,常見的五中檢索方式是物件導航圖語言(customers.getOrders())、通過OID獲取物件(session.get(Department.class,1))、HQL查詢語句、QBC、本地SQL。我們詳細

mySql連線,連線連線,

1.使用連線查詢的場景 將多張表進行記錄的連線查詢(按照某個欄位指定的條件進行資料的拼接); 進行資料的拼接(兩張表的內容顯示在一個結果表中 使用連線查詢) 最終的結果是:記錄數有可能變化,欄位數一定會增加(至少兩張表的合併) 意義:在使用者檢視資料的時候,顯示的資料

連線 ,右連線連線連線的4者區別

基本定義:   left join (左連線):返回包括左表中的所有記錄和右表中連線欄位相等的記錄。   right join (右連線):返回包括右表中的所有記錄和左表中連線欄位相等的記錄。   inner join (等值連線或者叫內連線):只返回兩個表中連線欄位相

資料庫的連線連線連線,全連線

Students表和Advisors表 一、內連線 按照Advistor_ID進行表的合併,合併後的資料只有兩個表中Advistor_ID都有的值,對應的行    二、左外連線 按照Advistor_ID進行的左外連接合並,保證表Students中Advistor_ID的

連線連線連線),右連線(右連線),全連線(交叉連線

有兩個表A和表B。表A結構如下: Aid:int;標識種子,主鍵,自增ID Aname:varchar 資料情況,即用select * from A出來的記錄情況如下圖1所示:   圖1:A表資料 表B結構如下: Bid:int;標識

連線連線、右連線、交叉連線及其區別

首先建立兩張表A、B。 表A: Aid:int型別,無符號遞增,主鍵 name:varchar型別 表B: Bid:int型別,無符號遞增,主鍵 name:varchar型別 age:int型

徹底搞懂Oracle的連線連線(以資料說話)

Employees表:     Department表:     select e.last_name,e.department_id,d.department_name from employees e left outer join departments d

連線連線、右連線、全連線、交叉連線(CROSS JOIN)-----小知識解決大資料攻略

       早就聽說了內連線與外連線,以前檢視中使用過、這次自考也學習了,只是簡單理解,現在深入探究學習(由於上篇部落格的出現)與實踐: 概念 關鍵字: 左右連線 資料表的連線有: 1、內連線(

迫切連線連線、 迫切連線連線

package com.baidu.test; import java.util.ArrayList; import java.util.LinkedHashSet; import java.util.List; import org.hibernate.Qu

連線連線 TOTO 一對一 一對多 結果不一樣的

1. 簡介 2. 建表 A表 B表 注: B表的parent_id對應A表的id 3. 測試 3.1 顯式內連線 -- 顯示內連線 SELECT A.*, B.* FROM A INNER JOIN B ON A.id = B.parent_i

連線連線、右連線、交叉連線區別

http://blog.csdn.net/cnham/archive/2008/06/25/2584936.aspx  在之前,我對MSSQL中的內連線和外連線所得出的資料集不是很清楚。這幾天重新溫習了一下SQL的書本,現在的思路應該是很清楚了,現在把自己的理解發出來給大家溫習下。希望和我一樣對SQL的連線

[資料庫]連線連線連線、又連線)、全連線、自連線

1 內連線: 它返回欄位ID(連線條件)同時存在於兩個表中的記錄,也就是說,僅當至少有一個同屬於兩表的行符合聯接條件時,內聯接才返回行,內聯接消除與另一個表中的任何行不匹配的行。(inner join或者join) 2 左連線: 左邊表全部行+右邊表相匹配

sql連線連線的區別

兩個表:A(id,name)資料:(1,張三)(2,李四)(3,王五)B(id,name)資料:(1,學生)(2,老師)(4,校長)左連線結果:select A.*,B.* from A left join B on A.id=B.id;1 張三 1 學生2 李四 2 老師

mysql連線連線、右連線、全連線詳解

內連線: 只連線匹配的行 左外連線: 包含左邊表的全部行(不管右邊的表中是否存在與它們匹配的行),以及右邊表中全部匹配的行 右外連線: 包含右邊表的全部行(不管左邊的表中是否存在與它們匹配的行),以及左邊表中全部匹配的行 全外連線: 包含左、右兩個表的全部行,不管另外一邊的表

連線連線、右連線、交叉連線區別(圖解)

在之前,我對MSSQL中的內連線和外連線所得出的資料集不是很清楚。這幾天重新溫習了一下SQL的書本,現在的思路應該是很清楚了,現在把自己的理解發出來給大家溫習下。希望和我一樣對SQL的連線語句不太理解的朋友能夠有所幫助

5分鐘學會MySql的那些連線連線連線等等

首先,我們新建兩個表(員工表,和部門表)DROP DATABASE db0206; CREATE DATABASE db0206; USE db0206; CREATE TABLE `db0206`.`tbl_dept`( `id` INT(11) NOT NULL

連線連線連線、右連線的區別

一:測試例子 存在如下兩張表:年級與班級,表內容如下 班級表 二:內連線與自然連線 1:自然連線 對於select * from gradeclass gc where gc.grade_id in (select id from grade),其結果如下圖 其查詢

MySQL之內連線()連線、右()連線詳解

用兩個表(a_table、b_table),關聯欄位a_table.a_id和b_table.b_id來操作一下內連線,左(外)連線,右(外)連線。 MySQL:Navicat 資料庫表:a_table、b_table 主題:內連線、左連線(左外連線)、右連線(右外連線) 建表語句:

mysql 資料庫查詢語句 連線連線 連線區別

 左外連結查詢:A  left join  B  on  conidtion  where condition       用A表 的全部資料去匹配 B表 B表無匹配資料時用null代替                       左聯左不丟資料  右外連線查詢:A  ri