linq之join子句
前面我们总结Linq查询子句总共有8个,join子句是我们讲解的最后一个子句。join子句也是相对比较复杂的,所以最后来讲。join子句可以处理两个数据源之间的联系,当然这两个数据源之间必须存在相关联的值。
join子句可以实现3中连接关系
1.内部联接:元素的联接关系必须同时满足被连接的两个数据源
2.分组联接:含有into子句的join子句
3.左外部联接
下面我们就详细的分析一下这三种联接方式。
准备数据:
除了前面用到的UserBaseInfo类,我们新增一个roles类:
1 using System; 2 using System.Data; 3 using System.Configuration; 4 using System.Linq; 5 using System.Web; 6 using System.Web.Security; 7 using System.Web.UI; 8 using System.Web.UI.HtmlControls; 9 using System.Web.UI.WebControls; 10 using System.Web.UI.WebControls.WebParts; 11 using System.Xml.Linq; 12 using System.Collections; 13 using System.Collections.Generic; 14 15 namespace LinqQueryDemo 16 { 17 /// <summary> 18 /// 角色的基本信息 19 /// </summary> 20 public class RoleInfo 21 { 22 private int id; 23 private string roleName; 24 25 /// <summary> 26 /// 角色的ID值 27 /// </summary> 28 public int ID 29 { 30 get { return id; } 31 set { id = value; } 32 } 33 /// <summary> 34 /// 角色的名称 35 /// </summary> 36 public string RoleName 37 { 38 get { return roleName; } 39 set { roleName = value; } 40 } 41 42 public RoleInfo(int id, string roleName) 43 { 44 this.id = id; 45 this.roleName = roleName; 46 } 47 } 48 }
内部联接
内部联接和sqlserver中的inner join类似,联接关系必须同时满足两个被联接的数据源。下面代码中的InnerJoinQuery方法演示了内部联接users和roles数据源的查询方法。
1 private void InnerJoinQuery() 2 { 3 4 List<UserBaseInfo> users = new List<UserBaseInfo>(); 5 List<RoleInfo> roles = new List<RoleInfo>(); 6 7 8 for (int i = 1; i < 10; i++) 9 { 10 users.Add(new UserBaseInfo(i, "users0" + i.ToString(), "user0" + i.ToString() + "@web.com", i * 2)); 11 roles.Add(new RoleInfo(i, "RoleName0" + i.ToString())); 12 } 13 14 //查询ID值小于9,且角色包含roles中的用户 15 var result = from u in users 16 join r in roles on u.RoleId equals r.ID 17 18 where u.ID < 9 19 select u; 20 21 foreach (var u in result) 22 { 23 24 Response.Write(u.UserName + "</br>"); 25 26 } 27 }
查询结果:
分组联接
含有into子句的join子句被分组连接。分组联接产生分层数据结构。它将第一个集合中的每个元素与第二个集合中的元素进行匹配,在查询结果中,第一个集合中的元素都会出现,第二个集合中的元素如果匹配成功,则使用被找到的元素否则为空。
下面的groupjoinquery函数演示分组联接。
1 private void GroupJoinQuery() 2 { 3 4 List<UserBaseInfo> users = new List<UserBaseInfo>(); 5 List<RoleInfo> roles = new List<RoleInfo>(); 6 7 8 for (int i = 1; i < 10; i++) 9 { 10 users.Add(new UserBaseInfo(i, "users0" + i.ToString(), "user0" + i.ToString() + "@web.com", i * 2)); 11 roles.Add(new RoleInfo(i, "RoleName0" + i.ToString())); 12 } 13 14 //查询ID值小于9,且角色包含roles中的用户 15 var result = from u in users 16 join r in roles on u.RoleId equals r.ID into g 17 18 where u.ID < 9 19 select new 20 { 21 ID = u.ID, 22 UserName = u.UserName, 23 Email = u.Email, 24 RoleId = u.RoleId, 25 Roles = g.ToList() 26 }; 27 foreach (var u in result) 28 { 29 30 Response.Write(u.UserName +","+(u.Roles.Count>0?u.Roles[0].RoleName:string.Empty)+ "</br>"); 31 32 } 33 }
查询结果:
左外部联接
左外部联接跟sqlserver中的left join相似。他返回第一个集合中的所有元素,第二个集合中与第一个集合相关的元素显示。如果第二个集合中没有找到相关的元素,就用DefaultEmpty方法来指定默认值。
1 private void LeftOuterJoinQuery() 2 { 3 4 List<UserBaseInfo> users = new List<UserBaseInfo>(); 5 List<RoleInfo> roles = new List<RoleInfo>(); 6 7 8 for (int i = 1; i < 10; i++) 9 { 10 users.Add(new UserBaseInfo(i, "users0" + i.ToString(), "user0" + i.ToString() + "@web.com", i * 2)); 11 roles.Add(new RoleInfo(i, "RoleName0" + i.ToString())); 12 } 13 14 //查询ID值小于9,且角色包含roles中的用户 15 var result = from u in users 16 where u.ID < 9 17 join r in roles on u.RoleId equals r.ID into gr 18 from ur in gr.DefaultIfEmpty() 19 select new 20 { 21 ID = u.ID, 22 UserName = u.UserName, 23 Email = u.Email, 24 RoleId = u.RoleId, 25 Roles = gr.ToList() 26 }; 27 foreach (var u in result) 28 { 29 30 Response.Write(u.UserName +","+(u.Roles.Count>0?u.Roles[0].RoleName:string.Empty)+ "</br>"); 31 32 } 33 }
运行结果:
linq之join子句相关推荐
- LINQ 之 JOIN(2)
LINQ之Join 分类: LINQ 2010-06-30 14:23 333人阅读 评论(0) 收藏 举报 适用场景:在我们表关系中有一对一关系,一对多关系,多对多关系等.对各个表之间的关系,就用这 ...
- C# -join 子句(C# 参考)
join 子句(C# 参考) 2015/07/20 适用于 Visual Studio 的兼容数据库系统 使用复合键进行联接 对 Join 子句的结果进行排序 执行分组联接 执行内部联接 执行左外部联 ...
- Linq之select子句
在Linq中select子句用来指定查询结果的类型和表现形式.Linq查询要么以select子句结尾,要么以group子句结尾. 1 List<UserBaseInfo> users = ...
- Mysql: SQL JOIN 子句详解
SQL JOIN 子句用于把来自两个或多个表的行结合起来,基于这些表之间的共同字段. 最常见的 JOIN 类型:SQL INNER JOIN(简单的 JOIN).SQL LEFT JOIN.SQL ...
- sql limit 子句_SQL Join子句介绍和概述
sql limit 子句 The SQL Join clause is one of the major components of the Select statement, which is us ...
- mysql inner join using_MySQL INNER JOIN子句
MySQL INNER JOIN子句 简介:在本教程中,您将学习如何使用MySQL INNER JOIN子句根据连接条件从多个表中选择数据. MySQL INNER JOIN子句介绍 MySQL IN ...
- LINQ学习——JOIN
一.JOIN的作用 1.使用联接来结合两个或更多的集合的数据. 2.联接操作接受两个集合然后创建一个临时的对象集合,每一个对象包含原始集合对象中的所有字段. Note:这里是包含而不是这个原实集合的字 ...
- C# linq left join
左连接查询 seleft a.*,b.column1,b.column2 from a left join b on a.id = b.id linq双表,多表连接查询 var list = from ...
- Linq 多表连接查询join
在查询语言中,通常需要使用联接操作.在 LINQ 中,可以通过 join 子句实现联接操作.join 子句可以将来自不同源序列,并且在对象模型中没有直接关系(数据库表之间没有关系)的元素相关联,唯一的 ...
最新文章
- hbuilderX的upx单位是什么鬼?
- 在Fragment中实现百度地图,定位到当前位置(基于SDKv2.1.0)
- 医疗软件产品核心算法部分说明--转载截取
- 5 多数据save_《Netlogo多主体建模入门》笔记 7
- java sessionstorage_sessionStorage的使用
- c语言中*用于指针,关于C语言中指针的理解
- [改善Java代码]不要覆写静态方法
- mongodb 查询内嵌文档
- CCF CSP201909-2 小明种苹果(续)
- matlab freqz用法ba,【matlab】freqz函数的使用(一)
- Centos7下载linux内核源码
- 我看过的安全方面的好文章
- 关于VS2019调试问题:进程已退出,代码为-1073741819(已解决)
- vue2 动态添加响应式数据
- 《黑天鹅》纳西姆-尼古拉斯-塔勒布_epub+mobi+azw3
- CF869C The Intriguing Obsession 题解
- 数学与计算机科学虎扑,北大数学系在国内是最顶级存在吗?
- Android 动画之一 Drawable Animation —— 逐帧(Frame)动画
- 120帧手机动态壁纸_小英雄高清动态壁纸app下载-小英雄高清动态壁纸v2.6手机下载...
- C++程序员发展方向
热门文章
- 程序实现switch语句判断年龄_【回顾】(选择执行语句if else和switch)乐创DIY C语言讲义——3.8节(4)...
- 二叉排序树的中序遍历规律_看懂这篇文章,玩转二叉查找树
- bootstrap与zookeeper区别
- 华为鸿蒙系统初探之HUAWEI DevEco Studio Hello World
- 自然语言处理期末复习(3)-(5)模型与句法分析
- 百练OJ:2800:垂直直方图
- 【设计模式】两大策略和六大原则
- Three.js中实现场景雾化效果
- Nodejs模块、自定义模块、CommonJs的概念和使用
- DevExpress的分页Tab控件XtraTabControl控件的使用