前面我们总结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子句相关推荐

  1. LINQ 之 JOIN(2)

    LINQ之Join 分类: LINQ 2010-06-30 14:23 333人阅读 评论(0) 收藏 举报 适用场景:在我们表关系中有一对一关系,一对多关系,多对多关系等.对各个表之间的关系,就用这 ...

  2. C# -join 子句(C# 参考)

    join 子句(C# 参考) 2015/07/20 适用于 Visual Studio 的兼容数据库系统 使用复合键进行联接 对 Join 子句的结果进行排序 执行分组联接 执行内部联接 执行左外部联 ...

  3. Linq之select子句

    在Linq中select子句用来指定查询结果的类型和表现形式.Linq查询要么以select子句结尾,要么以group子句结尾. 1 List<UserBaseInfo> users = ...

  4. Mysql: SQL JOIN 子句详解

    SQL JOIN 子句用于把来自两个或多个表的行结合起来,基于这些表之间的共同字段. 最常见的 JOIN 类型:SQL INNER JOIN(简单的 JOIN).SQL LEFT JOIN.SQL  ...

  5. sql limit 子句_SQL Join子句介绍和概述

    sql limit 子句 The SQL Join clause is one of the major components of the Select statement, which is us ...

  6. mysql inner join using_MySQL INNER JOIN子句

    MySQL INNER JOIN子句 简介:在本教程中,您将学习如何使用MySQL INNER JOIN子句根据连接条件从多个表中选择数据. MySQL INNER JOIN子句介绍 MySQL IN ...

  7. LINQ学习——JOIN

    一.JOIN的作用 1.使用联接来结合两个或更多的集合的数据. 2.联接操作接受两个集合然后创建一个临时的对象集合,每一个对象包含原始集合对象中的所有字段. Note:这里是包含而不是这个原实集合的字 ...

  8. C# linq left join

    左连接查询 seleft a.*,b.column1,b.column2 from a left join b on a.id = b.id linq双表,多表连接查询 var list = from ...

  9. Linq 多表连接查询join

    在查询语言中,通常需要使用联接操作.在 LINQ 中,可以通过 join 子句实现联接操作.join 子句可以将来自不同源序列,并且在对象模型中没有直接关系(数据库表之间没有关系)的元素相关联,唯一的 ...

最新文章

  1. hbuilderX的upx单位是什么鬼?
  2. 在Fragment中实现百度地图,定位到当前位置(基于SDKv2.1.0)
  3. 医疗软件产品核心算法部分说明--转载截取
  4. 5 多数据save_《Netlogo多主体建模入门》笔记 7
  5. java sessionstorage_sessionStorage的使用
  6. c语言中*用于指针,关于C语言中指针的理解
  7. [改善Java代码]不要覆写静态方法
  8. mongodb 查询内嵌文档
  9. CCF CSP201909-2 小明种苹果(续)
  10. matlab freqz用法ba,【matlab】freqz函数的使用(一)
  11. Centos7下载linux内核源码
  12. 我看过的安全方面的好文章
  13. 关于VS2019调试问题:进程已退出,代码为-1073741819(已解决)
  14. vue2 动态添加响应式数据
  15. 《黑天鹅》纳西姆-尼古拉斯-塔勒布_epub+mobi+azw3
  16. CF869C The Intriguing Obsession 题解
  17. 数学与计算机科学虎扑,北大数学系在国内是最顶级存在吗?
  18. Android 动画之一 Drawable Animation —— 逐帧(Frame)动画
  19. 120帧手机动态壁纸_小英雄高清动态壁纸app下载-小英雄高清动态壁纸v2.6手机下载...
  20. C++程序员发展方向

热门文章

  1. 程序实现switch语句判断年龄_【回顾】(选择执行语句if else和switch)乐创DIY C语言讲义——3.8节(4)...
  2. 二叉排序树的中序遍历规律_看懂这篇文章,玩转二叉查找树
  3. bootstrap与zookeeper区别
  4. 华为鸿蒙系统初探之HUAWEI DevEco Studio Hello World
  5. 自然语言处理期末复习(3)-(5)模型与句法分析
  6. 百练OJ:2800:垂直直方图
  7. 【设计模式】两大策略和六大原则
  8. Three.js中实现场景雾化效果
  9. Nodejs模块、自定义模块、CommonJs的概念和使用
  10. DevExpress的分页Tab控件XtraTabControl控件的使用