linq之join子句

时间:2022-05-03 20:53:11

  前面我们总结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>"); }
}

查询结果:
linq之join子句

分组联接

含有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>"); }
}

查询结果:
linq之join子句

左外部联接

左外部联接跟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子句