linq之join子句
2016-04-20 17:48
375 查看
前面我们总结Linq查询子句总共有8个,join子句是我们讲解的最后一个子句。join子句也是相对比较复杂的,所以最后来讲。join子句可以处理两个数据源之间的联系,当然这两个数据源之间必须存在相关联的值。
join子句可以实现3中连接关系
1.内部联接:元素的联接关系必须同时满足被连接的两个数据源
2.分组联接:含有into子句的join子句
3.左外部联接
下面我们就详细的分析一下这三种联接方式。
准备数据:
除了前面用到的UserBaseInfo类,我们新增一个roles类:
内部联接
内部联接和sqlserver中的inner join类似,联接关系必须同时满足两个被联接的数据源。下面代码中的InnerJoinQuery方法演示了内部联接users和roles数据源的查询方法。
查询结果:
分组联接
含有into子句的join子句被分组连接。分组联接产生分层数据结构。它将第一个集合中的每个元素与第二个集合中的元素进行匹配,在查询结果中,第一个集合中的元素都会出现,第二个集合中的元素如果匹配成功,则使用被找到的元素否则为空。
下面的groupjoinquery函数演示分组联接。
查询结果:
左外部联接
左外部联接跟sqlserver中的left join相似。他返回第一个集合中的所有元素,第二个集合中与第一个集合相关的元素显示。如果第二个集合中没有找到相关的元素,就用DefaultEmpty方法来指定默认值。
运行结果:
join子句可以实现3中连接关系
1.内部联接:元素的联接关系必须同时满足被连接的两个数据源
2.分组联接:含有into子句的join子句
3.左外部联接
下面我们就详细的分析一下这三种联接方式。
准备数据:
除了前面用到的UserBaseInfo类,我们新增一个roles类:
using System; using System.Data; using System.Configuration; using System.Linq; using System.Web; using System.Web.Security; using System.Web.UI; using System.Web.UI.HtmlControls; using System.Web.UI.WebControls; using System.Web.UI.WebControls.WebParts; using System.Xml.Linq; using System.Collections; using System.Collections.Generic; namespace LinqQueryDemo { /// <summary> /// 角色的基本信息 /// </summary> public class RoleInfo { private int id; private string roleName; /// <summary> /// 角色的ID值 /// </summary> public int ID { get { return id; } set { id = value; } } /// <summary> /// 角色的名称 /// </summary> public string RoleName { get { return roleName; } set { roleName = value; } } public RoleInfo(int id, string roleName) { this.id = id; this.roleName = roleName; } } }
内部联接
内部联接和sqlserver中的inner join类似,联接关系必须同时满足两个被联接的数据源。下面代码中的InnerJoinQuery方法演示了内部联接users和roles数据源的查询方法。
private void InnerJoinQuery() { List<UserBaseInfo> users = new List<UserBaseInfo>(); List<RoleInfo> roles = new List<RoleInfo>(); for (int i = 1; i < 10; i++) { users.Add(new UserBaseInfo(i, "users0" + i.ToString(), "user0" + i.ToString() + "@web.com", i * 2)); roles.Add(new RoleInfo(i, "RoleName0" + i.ToString())); } //查询ID值小于9,且角色包含roles中的用户 var result = from u in users join r in roles on u.RoleId equals r.ID where u.ID < 9 select u; foreach (var u in result) { Response.Write(u.UserName + "</br>"); } }
查询结果:
分组联接
含有into子句的join子句被分组连接。分组联接产生分层数据结构。它将第一个集合中的每个元素与第二个集合中的元素进行匹配,在查询结果中,第一个集合中的元素都会出现,第二个集合中的元素如果匹配成功,则使用被找到的元素否则为空。
下面的groupjoinquery函数演示分组联接。
private void GroupJoinQuery() { List<UserBaseInfo> users = new List<UserBaseInfo>(); List<RoleInfo> roles = new List<RoleInfo>(); for (int i = 1; i < 10; i++) { users.Add(new UserBaseInfo(i, "users0" + i.ToString(), "user0" + i.ToString() + "@web.com", i * 2)); roles.Add(new RoleInfo(i, "RoleName0" + i.ToString())); } //查询ID值小于9,且角色包含roles中的用户 var result = from u in users join r in roles on u.RoleId equals r.ID into g where u.ID < 9 select new { ID = u.ID, UserName = u.UserName, Email = u.Email, RoleId = u.RoleId, Roles = g.ToList() }; foreach (var u in result) { Response.Write(u.UserName +","+(u.Roles.Count>0?u.Roles[0].RoleName:string.Empty)+ "</br>"); } }
查询结果:
左外部联接
左外部联接跟sqlserver中的left join相似。他返回第一个集合中的所有元素,第二个集合中与第一个集合相关的元素显示。如果第二个集合中没有找到相关的元素,就用DefaultEmpty方法来指定默认值。
private void LeftOuterJoinQuery() { List<UserBaseInfo> users = new List<UserBaseInfo>(); List<RoleInfo> roles = new List<RoleInfo>(); for (int i = 1; i < 10; i++) { users.Add(new UserBaseInfo(i, "users0" + i.ToString(), "user0" + i.ToString() + "@web.com", i * 2)); roles.Add(new RoleInfo(i, "RoleName0" + i.ToString())); } //查询ID值小于9,且角色包含roles中的用户 var result = from u in users where u.ID < 9 join r in roles on u.RoleId equals r.ID into gr from ur in gr.DefaultIfEmpty() select new { ID = u.ID, UserName = u.UserName, Email = u.Email, RoleId = u.RoleId, Roles = gr.ToList() }; foreach (var u in result) { Response.Write(u.UserName +","+(u.Roles.Count>0?u.Roles[0].RoleName:string.Empty)+ "</br>"); } }
运行结果:
相关文章推荐
- JVM介绍
- selector加layer-list的用法
- eclipsesvn总是提示输入密码?svn总是提示输入密码的解决!
- Vue.js初体验
- myeclispe报java虚拟机内存溢出修改
- jQuery的正则表达式验证大写字母
- 2、Jenkins基础配置
- js 调用本地方法时兼容Android和Ios
- Anroid Handler 内存泄漏问题
- ACM程序设计大赛题目分类
- hadoop_案例_2
- 邮件页面为何只能Table写及注意事项
- 二叉树
- HDU 1907 John
- android多线程并发协调semaphore机制
- Spring HTTP Invoker使用介绍
- hiho 42 骨牌覆盖问题·二
- JSP杂项知识
- HTML DOM 属性
- 编译原理 词法分析