内连接
内连接产生一个结果集,对于该结果集内第一个集合中的每个元素,只要在第二个集合中存在一个匹配元素,该元素就会出现一次。
如果第一个集合中的某个元素没有匹配元素,则它不会出现在结果集内。
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},
};