Linq中鏈接

Linq中鏈接主要有組鏈接、內鏈接、左外鏈接、交叉鏈接四種。各個用法以下。code

    注:本文內容主要來自《Linq實戰》,本例中用到的對象請見文章底部。 對象

 

一、 組鏈接blog

    組鏈接是與分組查詢是同樣的。即根據分組獲得結果。 以下例,根據publisther分組獲得結果。ci

    使用組鏈接的查詢語句以下:rem

//使用組鏈接
var GroupQuery = from publisher in SampleData.Publishers
                 join book in SampleData.Books
                 on publisher equals book.Publisher into publisherBooks
                 select new
                 {
                   PublisherName = publisher.Name,
                   Books = publisherBooks
                 };

    與上邊等同的GroupBy語句以下: it

 //使用Group
 var QueryByGroup = from book in SampleData.Books
                    group book by book.Publisher into grouping
                    select new
                    {
                         PublisherName = grouping.Key.Name,
                         Books = grouping
                    };

 

二、內鏈接 io

    內鏈接與SqL中inner join同樣,即找出兩個序列的交集。以下例找出book中的Publisher存在於SampleData.Publishers的資料。ast

    內鏈接查詢語句以下:class

//join查詢語句
var joinQuery = from publisher in SampleData.Publishers
                join book in SampleData.Books
                on publisher equals book.Publisher
                select new
                {
                    PublisherName = publisher.Name,
                    BookName = book.Title
                };泛型

    與上邊等同的查詢操做符語句以下:

//join操做符語句
     SampleData.Publishers.Join(
                SampleData.Books,               //join 對象
                publisher => publisher,         //外部的key
                book => book.Publisher,         //內部的key
                (publisher, book) => new        //結果
                {
                    PublisherName = publisher.Name,
                    BookName = book.Title
                });

 

三、左外鏈接

     左外鏈接與SqL中left join同樣。以下例找出根據publisher中找出SampleData.Publishers中全部資料和book中存在於publisher的資料。

     左外鏈接查詢語句以下: 

//left join, 爲空時用default
 var leftJoinQuerybyDefault = from publisher in SampleData.Publishers
                              join book in SampleData.Books
                              on publisher equals book.Publisher into publisherBooks
                              from book in publisherBooks.DefaultIfEmpty()
                              select new
                              {
                                    PublisherName = publisher.Name,
                                    BookName = (book == default(Book)) ? "no book" : book.Title
                              };

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

    咱們能夠不使用default關鍵字,但在要DefaultIfEmpty中給定當空時的默認對象值。語句以下: 

//left join, 爲空時使用默認對象
 var leftJoinQuery = from publisher in SampleData.Publishers
                     join book in SampleData.Books
                     on publisher equals book.Publisher into publisherBooks
                     from book in publisherBooks.DefaultIfEmpty(
                       new Book { Title = "" }                         //設置爲空時的默認值
                     )
                    select new
                    {
                        PublisherName = publisher.Name,
                        BookName = book.Title
                    };

 

四、交叉鏈接

    交叉鏈接與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
                }
                ));

 

 本像用到的對象:

  static public class SampleData   {     static public Publisher[] Publishers =     {       new Publisher {Name="FunBooks"},       new Publisher {Name="Joe Publishing"},       new Publisher {Name="I Publisher"}     };     static public Author[] Authors =     {       new Author {FirstName="Johnny", LastName="Good"},       new Author {FirstName="Graziella", LastName="Simplegame"},       new Author {FirstName="Octavio", LastName="Prince"},       new Author {FirstName="Jeremy", LastName="Legrand"}     };     static public Subject[] Subjects =     {       new Subject {Name="Software development"},       new Subject {Name="Novel"},       new Subject {Name="Science fiction"}     };     static public Book[] Books =     {       new Book {         Title="Funny Stories",         Publisher=Publishers[0],         Authors=new[]{Authors[0], Authors[1]},         PageCount=101,         Price=25.55M,         PublicationDate=new DateTime(2004, 11, 10),         Isbn="0-000-77777-2",         Subject=Subjects[0]       },       new Book {         Title="LINQ rules",         Publisher=Publishers[1],         Authors=new[]{Authors[2]},         PageCount=300,         Price=12M,         PublicationDate=new DateTime(2007, 9, 2),         Isbn="0-111-77777-2",         Subject=Subjects[0]       },       new Book {         Title="C# on Rails",         Publisher=Publishers[1],         Authors=new[]{Authors[2]},         PageCount=256,         Price=35.5M,         PublicationDate=new DateTime(2007, 4, 1),         Isbn="0-222-77777-2",         Subject=Subjects[0]       },       new Book {         Title="All your base are belong to us",         Publisher=Publishers[1],         Authors=new[]{Authors[3]},         PageCount=1205,         Price=35.5M,         PublicationDate=new DateTime(2006, 5, 5),         Isbn="0-333-77777-2",         Subject=Subjects[2]       },       new Book {         Title="Bonjour mon Amour",         Publisher=Publishers[0],         Authors=new[]{Authors[1], Authors[0]},         PageCount=50,         Price=29M,         PublicationDate=new DateTime(1973, 2, 18),         Isbn="2-444-77777-2",         Subject=Subjects[1]       }     };   }
相關文章
相關標籤/搜索