前面我们总结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. for (int i = ; i < ; i++)
  8. {
  9. users.Add(new UserBaseInfo(i, "users0" + i.ToString(), "user0" + i.ToString() + "@web.com", i * ));
  10. roles.Add(new RoleInfo(i, "RoleName0" + i.ToString()));
  11. }
  12.  
  13. //查询ID值小于9,且角色包含roles中的用户
  14. var result = from u in users
  15. join r in roles on u.RoleId equals r.ID
  16.  
  17. where u.ID <
  18. select u;
  19.  
  20. foreach (var u in result)
  21. {
  22.  
  23. Response.Write(u.UserName + "</br>");
  24.  
  25. }
  26. }

查询结果:

分组联接

含有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. for (int i = ; i < ; i++)
  8. {
  9. users.Add(new UserBaseInfo(i, "users0" + i.ToString(), "user0" + i.ToString() + "@web.com", i * ));
  10. roles.Add(new RoleInfo(i, "RoleName0" + i.ToString()));
  11. }
  12.  
  13. //查询ID值小于9,且角色包含roles中的用户
  14. var result = from u in users
  15. join r in roles on u.RoleId equals r.ID into g
  16.  
  17. where u.ID <
  18. select new
  19. {
  20. ID = u.ID,
  21. UserName = u.UserName,
  22. Email = u.Email,
  23. RoleId = u.RoleId,
  24. Roles = g.ToList()
  25. };
  26. foreach (var u in result)
  27. {
  28.  
  29. Response.Write(u.UserName +","+(u.Roles.Count>?u.Roles[].RoleName:string.Empty)+ "</br>");
  30.  
  31. }
  32. }

查询结果:

左外部联接

左外部联接跟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. for (int i = ; i < ; i++)
  8. {
  9. users.Add(new UserBaseInfo(i, "users0" + i.ToString(), "user0" + i.ToString() + "@web.com", i * ));
  10. roles.Add(new RoleInfo(i, "RoleName0" + i.ToString()));
  11. }
  12.  
  13. //查询ID值小于9,且角色包含roles中的用户
  14. var result = from u in users
  15. where u.ID <
  16. join r in roles on u.RoleId equals r.ID into gr
  17. from ur in gr.DefaultIfEmpty()
  18. select new
  19. {
  20. ID = u.ID,
  21. UserName = u.UserName,
  22. Email = u.Email,
  23. RoleId = u.RoleId,
  24. Roles = gr.ToList()
  25. };
  26. foreach (var u in result)
  27. {
  28.  
  29. Response.Write(u.UserName +","+(u.Roles.Count>?u.Roles[].RoleName:string.Empty)+ "</br>");
  30.  
  31. }
  32. }

运行结果:

linq之join子句的更多相关文章

  1. LINQ查询表达式---------join子句

    LINQ查询表达式---------join子句 join 子句接受两个源序列作为输入. 每个序列中的元素都必须是可以与另一个序列中的相应属性进行比较的属性,或者包含一个这样的属性. join子句使用 ...

  2. 用Join子句进行分组联接

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...

  3. C# join子句

    join 子句可用于将来自不同源序列并且在对象模型中没有直接关系的元素相关联. 唯一的要求是每个源中的元素需要共享某个可以进行比较以判断是否相等的值. 例如,食品经销商可能拥有某种产品的供应商列表以及 ...

  4. join 子句(C# 参考)

    参考:https://msdn.microsoft.com/zh-cn/library/vstudio/bb311040%28v=vs.110%29.aspx 使用 join 子句可以将来自不同源序列 ...

  5. LINQ-let子句、join子句

    1.Let子句 let子句用于在LINQ表达式中存储子表达式的计算结果,既let子句创建一个范围变量来存储结果,变量被创建后,不能修改或把其他表达式的结果重新赋值给它.此范围变量可以在后续的LINQ中 ...

  6. Linq之select子句

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

  7. Linq中join & group join & left join 的用法

    Linq中join & group join & left join 的用法 2013-01-30 11:12 12154人阅读 评论(0) 收藏 举报  分类: C#(14)  文章 ...

  8. MySQL INNER JOIN子句介绍

    MySQL INNER JOIN子句介绍 MySQL INNER JOIN子句将一个表中的行与其他表中的行进行匹配,并允许从两个表中查询包含列的行记录. INNER JOIN子句是SELECT语句的可 ...

  9. C# LinQ的基本子句、协变与异变

    //1.from 子句: , , , , , , , , , }; var query = from n in arr select n; foreach (var i in query) { Con ...

随机推荐

  1. Visual Studio 2008 使用 WinCE 5.0 Emulator

    1. 簡介 由於 Visua Studio 2008 與 WinCE 5.0 Emulator 並沒有完全整合,因此想要測試我們所開發的 Windows CE 程式,需透過設定,將我們所開發的程式丟到 ...

  2. nodejs express 框架解密1-总体结构

    本文是基于express3.4.6的. 1.express 代码结构为: bin/express 是在命令行下的生成express 框架目录文件用的 lib/express 是框架的入口文件 lib/ ...

  3. MySQL – 导出数据成csv

    方案有很多种,我这里简单说一下: 1.  into outfile SELECT * FROM mytable INTO OUTFILE '/tmp/mytable.csv' FIELDS TERMI ...

  4. oracle 中触发器增加存储过程commit问题

    触发器无需commit也不能写commit触发器和触发它的DML是同一个事务DML提交了,触发器的操作也提交了,要不就一起回滚了 当然,如果你一定要在触发器里写COMMIT那就用自治事务相当于一个事务 ...

  5. [亿能测试_www.gdtesting.com]测试技术资料网盘共享

    [亿能测试_www.gdtesting.com]测试技术资料网盘共享: http://pan.baidu.com/share/home?uk=974090852

  6. Oracle 11g EM安全证书问题无法访问的解决办法

    OS: Windows Server 2012 Oracle: 11g R2 上一篇 Oracle 11g EM删除重建的方法 通过命令的方式重建了EM,启动也成功 emctl status dbco ...

  7. React Native ——实现一个简单的抓取github上的项目数据列表

    /** * Sample React Native App * https://github.com/facebook/react-native */ 'use strict'; var React ...

  8. OpenGL cubeMap

    glsl 的reflect(I,N)其中I是 眼睛(camera)位置到顶点位置的方向向量,N为顶点法线,必须要归一化 橙宝书里给出的计算过程是这样的:reflect(I,N) = I - 2 *do ...

  9. Subgradient Algorithm

    Subgradient是一种可以优化不可微的凸函数的方法. 首先回顾凸函数的定义: $f(y) \geq f(x) + \nabla f(x)^T(y-x), all \hspace{2 pt} x, ...

  10. bower 新建.bowerrc文件

    Twitter工程师团队推出了Bower,这是一个针对Web开发的包管理器.该工具主要用来帮助用户轻松安装CSS.JavaScript.图像等相关包,并管理这些包之间的依赖. 随着网页功能变得越来越复 ...