C# 合并两个不同类型集合数据

别名:使用lambda表达式来实现Left Join


先把两个不同的类数据摆上。

    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 }。 

内连接
内连接
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值