zoukankan      html  css  js  c++  java
  • Linq中的连接(join)

    Linq中连接主要有组连接、内连接、左外连接、交叉连接四种。各个用法如下。

        注:本文内容主要来自《Linq实战》,本例中用到的对象请见文章底部。

    1、 组连接

        组连接是与分组查询是一样的。即根据分组得到结果。 如下例,根据publisther分组得到结果。

        使用组连接的查询语句如下:

    复制代码
                //使用组连接
                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语句如下:

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

    2、内连接

        内连接与SqL中inner join一样,即找出两个序列的交集。如下例找出book中的Publisher存在于SampleData.Publishers的资料。

        内连接查询语句如下:

    复制代码
                //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
                    });
    复制代码

    3、左外连接

         左外连接与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
                                            };
    复制代码

    4、交叉连接

        交叉连接与SqL中Cross join一样。如下例中找出SampleData.PublishersSampleData.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(20041110),
            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(200792),
            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(200741),
            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(200655),
            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(1973218),
            Isbn
    ="2-444-77777-2",
            Subject
    =Subjects[1]
          }
        };
      }
    复制代码

    *************转载:https://www.cnblogs.com/scottckt/archive/2010/08/11/1797716.html

  • 相关阅读:
    java 基础(Collections 工具类的常用方法)
    Java 基础( Map 实现类: Properties)
    Java 基础(Map)
    Java 基础(集合三)
    Java 基础(集合二)
    Java 基础(集合一)
    Java 基础(Annotation)
    CentOS7 系统 springboot应用启动脚本
    GenericObjectPool源码分析
    问题springboot项目启动报错
  • 原文地址:https://www.cnblogs.com/linybo/p/10091191.html
Copyright © 2011-2022 走看看