您的位置:首页 > 其它

linq之join子句

2016-04-20 17:48 375 查看
  前面我们总结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 = 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>");

}
}


运行结果:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: