內連接查詢
內連接與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腳本語言如下所示:
右連接只要把 查詢對象的順序對調就是了。例如:
1、左連接: var LeftJoin = from emp in ListOfEmployees join dept in ListOfDepartment on emp.DeptID equals dept.ID into JoinedEmpDept from dept in JoinedEmpDept.DefaultIfEmpty() select new { EmployeeName = emp.Name, DepartmentName = dept != null ? dept.Name : null }; 2、右連接: var RightJoin = from dept in ListOfDepartment join employee in ListOfEmployees on dept.ID equals employee.DeptID into joinDeptEmp from employee in joinDeptEmp.DefaultIfEmpty() select new { EmployeeName = employee != null ? employee.Name : null, DepartmentName = dept.Name };
全連接查詢例子:
var res = from a in sys.Apple from b in sys.Banana select new { a.Id, a.Name, //Bananas = b1 t = b.AppleId };
LINQ的連接查詢通過join字句實現,但一個join字句一次只能連接2個數據源。其基本語法如下:
var query= from a in list1
jion b in list2
on a.id equals b.id
select ……
當有3個或更多的數據源需要連接查詢時,當個join字句就不能勝任了。解決辦法有2個:一是嵌套查詢,二是將連接查詢的結果和另外的數據源再次連接查詢。
第二種方法的實例查詢如下:
var query = from x in stuinfo join y in studetail on x.sid equals y.sid select new {sid=x.sid,sname=x.sname,ssex=y.ssex }; var query2 = from z in query join k in stuscore on z.sid equals k.sid select new {sid=z.sid,sname=z.sname,ssex=z.ssex,smath=k.smath }; foreach (var t in query2) { listBox1.Items.Add(t.sid+"-"+t.sname+"-"+t.ssex+"-"+t.smath); }
交叉連接查詢
交叉連接與SqL中Cross join一樣。如下例中找出SampleData.Publishers與SampleData.Books的交叉連接。
交叉連接查詢語句:
var crossJoinQuery = from publisher in SampleData.Publishers from book in SampleData.Books select new { PublisherName = publisher.Name, BookName = book.Title };
查詢操作符語句:
//不使用查詢表達式 SampleData.Publishers.SelectMany(publisher => SampleData.Books.Select( book => new { PublisherName = publisher.Name, BookName = book.Title } ));
LinQ中Union合並查詢:連接不同的集合,自動過濾相同項;延遲。即是將兩個集合進行合並操作,過濾相同的項
var cities = (from p in mylinq.System_Places where p.PID == place select p).Union( from q in mylinq.System_Places where q.Parentid==place select q );
LinQ中的Concat連接查詢:連接不同的集合,不會自動過濾相同項;延遲。
(from p in System_Places where p.PID == 1010 select p).Concat( from q in System_Places where q.Parentid==1010 select q ).Concat( from n in System_Places where n.Parentid==1010 select n )
LinQ中的Intersect相交查詢:獲取不同集合的相同項(交集),即兩集合都出現的項。
(from c in Bst_System_Places select c.CnPlaceName).Intersect( from e in Bst_Company_Jobs select e.WorkPlace)
LinQ中的Except與非查詢:排除相交項,即從某集合中排除與另一集合中相同的項,以前集合為主
(from e in Bst_Company_Jobs select e.WorkPlace).Except( from c in Bst_System_Places select c.CnPlaceName)
另可對照sql的連接查詢隨筆:區分SQL Server關聯查詢之inner join,left join, right join, full outer join並圖解
http://www.cnblogs.com/shy1766IT/p/5191917.html
