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表達式,在此不再累述。

 

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM