Linq - Join (内连接、左外连接、组连接)

内连接

内连接产生一个结果集,对于该结果集内第一个集合中的每个元素,只要在第二个集合中存在一个匹配元素,该元素就会出现一次。

如果第一个集合中的某个元素没有匹配元素,则它不会出现在结果集内。

var query = from province in Provinces
            join city in Citys on province.ProID equals city.ProID
            select new { ProName = province.ProName, CityName = city.CityName };
foreach (var q in query)
{
    Console.WriteLine("{0,-5}{1}", q.ProName + ":", q.CityName);
}

左外连接

左外连接是这样一个连接:在其中返回第一个集合的每个元素,而无论该元素在第二个集合中是否具有相关元素。

使用了DefaultIfEmpty操作符,它能够为实序列提供一个默认的元素,默认为 null(引用类型)0(值类型)

var query = from province in Provinces
            join city in Citys on province.ProID equals city.ProID into result1
            from province_city in result1.DefaultIfEmpty()
            select new { province.ProName, CityName = (procity == null ? String.Empty : procity.CityName) };
foreach (var v in query)
{
   Console.WriteLine("{0,-5}{1}", v.ProName + ":", v.CityName);
}

组连接

分组联接可用于产生分层数据结构。 它将第一个集合中的每个元素与第二个集合中的一组相关元素进行配对。

var query = from province in Provinces
            join city in Citys on province.ProID equals city.ProID into gj
            select new
            {
                ProName = province.ProName,
                City = gj
            };
foreach (var v in query)
{
    //输出省份
    Console.WriteLine("{0}:", v.ProName);
    //输出省份对应的城市
    foreach (City c in v.City)
        Console.WriteLine("  {0}", c.CityName);
}

数据源

class Province
{
    public int ProID { get; set; }
    public string ProName { get; set; }
}
 
class City
{
    public string CityName { get; set; }
    public int ProID { get; set; }
}
 
List<Province> Provinces = new List<Province>()
{
    new Province(){ProID = 1,ProName="广东"},
    new Province(){ProID = 2,ProName="浙江"},
    new Province(){ProID = 3,ProName="江西"},
    new Province(){ProID = 4,ProName="湖北"},
};
List<City> Citys = new List<City>()
{
    new City{CityName="深圳",  ProID=1},
    new City{CityName="广州",  ProID=1},
    new City{CityName="惠州",  ProID=1},
    new City{CityName="杭州",  ProID=2},
    new City{CityName="金华",  ProID=2},
    new City{CityName="景德镇",  ProID=3},
    new City{CityName="南昌",  ProID=3},
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值