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 ==
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脚本语言如下所示:
右连接只要把 查询对象的顺序对调就是了。例如:
、左连接:
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
}; 、右连接:
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
}
));
LinQ中Union合并查询:连接不同的集合,自动过滤相同项;延迟。即是将两个集合进行合并操作,过滤相同的项
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 ==
select p).Concat(
from q in System_Places
where q.Parentid==
select q
).Concat(
from n in System_Places
where n.Parentid==
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
Linq连接查询之左连接、右连接、内连接、全连接、交叉连接、Union合并、Concat连接、Intersect相交、Except与非查询的更多相关文章
- linq to sql 实现左(右)连接,那个方法是对的,该怎么处理
linq to sql 实现左(右)连接,那个方法是对的var query2 = from tb0 in db.table_0 join tb1 in db.table_1 on table_0.关 ...
- 关于数据库的左,右,内,外连接,Union和Union all---------笔记
1.左连接 select a.filed1,a.filed2,b.filed1 from a (左表) left join b(右表) on a.commonfiled = b.commonfiled ...
- PHP左、右、内连接
left join :左连接,返回左表中所有的记录以及右表中连接字段相等的记录.right join :右连接,返回右表中所有的记录以及左表中连接字段相等的记录.inner join: 内连接,又 ...
- LinQ中合并、连接、相交、与非查询
LinQ中Union合并查询:连接不同的集合,自动过滤相同项:延迟.即是将两个集合进行合并操作,过滤相同的项 var cities = (from p in mylinq.System_Places ...
- 迁移到MSYS2 与 Qt 工具链注意的几个事情(g++在链接时,符号依赖项查找遵循从左至右的顺序,但qmake会自动合并造成错误。使用脚本给Mingw32-make创造出一个局部的VC编译环境)
Microsoft Visual Studio 2015社区版提供了强大的开发体验,且 Qt 提供了预编译版本.然而,由于客户提出兼容Windows XP ~ Windows 8.1 这样宽泛的环境要 ...
- Linq左关联 右关联 内关联
1.左连接: var LeftJoin = from emp in ListOfEmployees join dept in ListOfDepartment on emp.DeptID equals ...
- SQL&&LINQ:左(外)连接,右(外)连接,内连接,完全连接,交叉连接,多对多连接
SQL: 外连接和内连接: 左连接或左外连接:包含左边的表的所有行,如果右边表中的某行没有匹配,该行内容为空(NULL) --outer jion:left join or left outer jo ...
- Linq 和 SQL的左连接、右连接、内链接
在我们工作中表连接是很常用的,但常用的有这三种连接方式:左连接.右连接.内链接 在本章节中讲的是1.如何在Linq中使用左连接,右连接,内连接. 2.三种连接之间的特点在哪? 3.Linq的三种连接语 ...
- sqlalchemy多表联合查询的左连接、右连接等使用
#按用户名摸糊查询trans_details.query.join(Uses).filter(Users.username.like('%xx%'))#select xxx from trans_de ...
随机推荐
- MySQL创建索引语法
1.介绍: 所有mysql索引列类型都可以被索引,对来相关类使用索引可以提高select查询性能,根据mysql索引数,可以是最大索引与最小索引,每种存储引擎对每个表的至少支持16的索引.总索引长度为 ...
- Confluent介绍(二)--confluent platform quickstart
下载 http://www.confluent.io/download,打开后,显示最新版本3.0.0,然后在右边填写信息后,点击Download下载. 之后跳转到下载页面,选择zip 或者 tar都 ...
- 烂泥:【解决】修改LVM卷组名重启系统后,无法进入进入系统
本文由秀依林枫提供友情赞助,首发于烂泥行天下. 一台服务器系统已经安装完毕,但是LVM的卷组vg使用的是默认的VolGroup名称,使用起来感觉不舒服,打算把这个卷组名称修改为vg. 先来查看系统中有 ...
- 八、Android学习第七天——XML文件解析方法(转)
(转自:http://wenku.baidu.com/view/af39b3164431b90d6c85c72f.html) 八.Android学习第七天——XML文件解析方法 XML文件:exten ...
- C++ 笔记(一) —— 尽量以 const、enum、inline 替换 #define
ilocker:关注 Android 安全(新手) QQ: 2597294287 #define ASPECT_RATIO 1.653 记号 ASPECT_RATIO 不会进入 symbol tabl ...
- poj 2104 K-th Number(可持久线段树)
K-th Number 持久化:http://www.cnblogs.com/tedzhao/archive/2008/11/12/1332112.html 结构:http://www.docin.c ...
- KVM 介绍(1):简介及安装
学习 KVM 的系列文章: (1)介绍和安装 (2)CPU 和 内存虚拟化 (3)I/O QEMU 全虚拟化和准虚拟化(Para-virtulizaiton) (4)I/O PCI/PCIe设备直接分 ...
- 实现跨云应用——基于DNS的负载均衡
“公有云可以作为传统IT资源的延展,能帮助客户应对不断变化的需求”——这是我们在向客户介绍公有云产品时经常说的一句话.我们来看一个具体的需求: 某客户有一个web站点,部署在自有的数据中心(on-pr ...
- 大一上学期的一点小疑惑,代码验证ok
#include<iostream> using namespace std; class test { int *p; int pn; public: test(int n) { p = ...
- 怎样用好ZBrush 中的映射大师功能
Projection Master可以理解为映射大师它是ZBrush®中一个独特的功能,允许在3D模型中使用2D和2.5D笔刷,用户可以利用此功能将绘制的颜色. Texture及纹理等映射到模型表面. ...