前面我们总结Linq查询子句总共有8个,join子句是我们讲解的最后一个子句。join子句也是相对比较复杂的,所以最后来讲。join子句可以处理两个数据源之间的联系,当然这两个数据源之间必须存在相关联的值。

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 = ; i < ; i++)
{
users.Add(new UserBaseInfo(i, "users0" + i.ToString(), "user0" + i.ToString() + "@web.com", i * ));
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 <
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 = ; i < ; i++)
{
users.Add(new UserBaseInfo(i, "users0" + i.ToString(), "user0" + i.ToString() + "@web.com", i * ));
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 <
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>?u.Roles[].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 = ; i < ; i++)
{
users.Add(new UserBaseInfo(i, "users0" + i.ToString(), "user0" + i.ToString() + "@web.com", i * ));
roles.Add(new RoleInfo(i, "RoleName0" + i.ToString()));
} //查询ID值小于9,且角色包含roles中的用户
var result = from u in users
where u.ID <
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>?u.Roles[].RoleName:string.Empty)+ "</br>"); }
}

运行结果:

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. HTTP 错误 500.21 - Internal Server Error 处理程序“ExtensionlessUrlHandler-ISAPI-4.0_64bit”在其模块列表中有一个错误模块“IsapiModule” 解决方法

    IIS在发布网站后找不到首页,提示以上错误,原因是在“应用程序池”中,把对应的网站的“托管管道模式”设置为“集成”即可.

  2. A Simple MVVM Example[Forward]

    In my opinion, if you are using WPF or Silverlight you should be using the MVVM design pattern. It i ...

  3. 深入剖析 redis 主从复制

    主从概述 redis 支持 master-slave(主从)模式,redis server 可以设置为另一个 redis server 的主机(从机),从机定期从主机拿数据.特殊的,一个 从机同样可以 ...

  4. Android 结合实例学会AsyncTask的用法

    AsyncTask执行时经过四个步骤,执行四个方法: 1.onPreExecute(),运行在UI线程,可以设置或修改UI控件,如显示一个进度条 2.doInBackground,运行在后台线程,不可 ...

  5. 【汇总】涉及iOS&iPhone开发相关文章汇总

    此文章汇总本博客中有涉及iPhone开发的相关文章,不定时更新中... 1.NSUserDefaults快速存储数据: http://www.cnblogs.com/ios-wmm/archive/2 ...

  6. Android客户端与PHP服务端交互(一)---框架概述

    背景 作为一个普通上班族,总是想做一些自认为有意义的事情,于是乎准备成立一个工作室,尽管目前正在筹备阶段,但是之前有些朋友提出一些需求的时候,我发现自己的能力还是有限,直到最近和一些技术牛朋友聊起这事 ...

  7. GitHub 操作流程示例

    最新文章:Virson's Blog 参考文章: 博客园-Web前端开发,博客园-喻头快跑,GotGitHub 首先.通过github网站新建一个仓库,得到仓库地址 https://github.co ...

  8. Amazon的Fire Phone之于Android开发者

    在上周Amazon也耐不住加入了手机竞争行列之中,发布了自己的Fire Phone,于是Android家族又多了一位变种成员,Android系统的碎片化程度也进一步加剧.因为工作的关系,我有幸在上个月 ...

  9. Etl之HiveSql调优(设置map reduce 的数量)

    前言: 最近发现hivesql的执行速度特别慢,前面我们已经说明了left和union的优化,下面咱们分析一下增加或者减少reduce的数量来提升hsql的速度. 参考:http://www.cnbl ...

  10. win10上安装Docker

    方法1:具体我没有试过,不知道win10下可以么.http://blog.csdn.net/zistxym/article/details/42918339 方法2: 先安装VirtualBox(下载 ...