Linq中连接主要有组连接、内连接、左外连接、交叉连接四种
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
}
));
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 测试 APP 抓不到数据包该怎么办
- 手把手教你搭建SSM框架(Eclipse版)
- 【手把手教你】使用pyfinance进行证券收益分析
- [English] Creating a New Theme
- 脏读,不可重复读,幻读
- 建议收藏!这份MySQL 连接查询超全详解送给你
- Redis点赞新思路 bitmap
- PyQt5 技术篇-调用字体对话框(QFontDialog)获取字体,控件设置字体。
- deepin使用
- 解决deepin下安装sqlite3依赖过新的问题
- PyQt5 技术篇-调用文件对话框获取文件、文件夹路径。文件对话框返回选中的多个文件路径
- deepin安装golang
- PyQt5 技术篇-调用输入对话框(QInputDialog)获取用户输入内容。
- Python+selenium 自动化-通过窗口名切换窗口,如何获取当前窗口的title窗口名
- deepin 任务栏消失问题