前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Linq中连接主要有组连接、内连接、左外连接、交叉连接四种

Linq中连接主要有组连接、内连接、左外连接、交叉连接四种

作者头像
逸鹏
发布2018-04-10 14:04:22
2K0
发布2018-04-10 14:04:22
举报
文章被收录于专栏:逸鹏说道

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.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

}

));

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2016-05-11,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 我为Net狂 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
数据库
云数据库为企业提供了完善的关系型数据库、非关系型数据库、分析型数据库和数据库生态工具。您可以通过产品选择和组合搭建,轻松实现高可靠、高可用性、高性能等数据库需求。云数据库服务也可大幅减少您的运维工作量,更专注于业务发展,让企业一站式享受数据上云及分布式架构的技术红利!
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档