先把两个不同的类数据摆上。
public class User
{
/// <summary>
/// 用户编号
/// </summary>
public int User_Id { get; set; }
/// <summary>
/// 区域编号
/// </summary>
public int Area_Id { get; set; }
/// <summary>
/// 用户名
/// </summary>
public string User_Name { get; set; }
}
public class Area
{
/// <summary>
/// 区域编号
/// </summary>
public int Area_Id { get; set; }
/// <summary>
/// 区域名
/// </summary>
public string Area_Name { get; set; }
}
List<User> userList = new List<User>();
userList.Add(new User { User_Id = 1, Area_Id = 1, User_Name = "张三" });
userList.Add(new User { User_Id = 2, Area_Id = 2, User_Name = "李四" });
userList.Add(new User { User_Id = 3, Area_Id = 1, User_Name = "王五" });
userList.Add(new User { User_Id = 4, Area_Id = 9, User_Name = "赵四" });
List<Area> areaList = new List<Area>();
areaList.Add(new Area { Area_Id = 1, Area_Name = "广州市" });
areaList.Add(new Area { Area_Id = 2, Area_Name = "汕头市" });
areaList.Add(new Area { Area_Id = 3, Area_Name = "佛山市" });
areaList.Add(new Area { Area_Id = 4, Area_Name = "深圳市" });
areaList.Add(new Area { Area_Id = 5, Area_Name = "珠海市" });
areaList.Add(new Area { Area_Id = 7, Area_Name = "韶关市" });
两个集合类型的数据都已添加完毕,现在我想实现一个这样的功能 :
外连接:
我想查询每个用户所对应的的城市名
要想使用lambda来解决这个问题,就需要使用到GroupJoin
GroupJoin可以将两个不同类型的数据进行关联,同时分组,类似于SQL中的外连接。
var resultList = userList.GroupJoin(areaList, u => u.Area_Id, a => a.Area_Id, (u, a) => new {
Area_Id = u.Area_Id,
User_Name = u.User_Name,
Area_Name = a.FirstOrDefault(x => x.Area_Id == u.Area_Id)==null?"Null": a.FirstOrDefault(x => x.Area_Id == u.Area_Id).Area_Name
}).Select(o => o).ToList();
因为上面有个用户的Area_Id=9,在集合中并没有出现这个城市,所以需要判断是否为空,不然会出现异常。
如果你不想筛选列,那就可以改成(u,a) => new { u, a }。
内连接:
现在我想查询有对应城市的用户,也就是赵四不出现结果中。
那就需要将GroupJoin改为Join!
Join可以将两个不同类型的数据进行关联,不分组,类似于SQL中的内连接。
var result = userList.Join(areaList, u => u.Area_Id, a => a.Area_Id, (u, a) => new {
Area_Id = u.Area_Id,
User_Name = u.User_Name,
Area_Name = a.Area_Name
}).Select(o => o).ToList();
t同样你不想筛选列,那就可以改成(u,a) => new { u, a }。