Linq連接查詢之左連接、右連接、內連接、全連接、交叉連接、Union合並、Concat連接、Intersect相交、Except與非查詢


內連接查詢

內連接與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
                }
                ));

 

LinQUnion合並查詢連接不同的集合,自動過濾相同項;延遲。即是將兩個集合進行合並操作,過濾相同的項

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


免責聲明!

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



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