本章节主要介绍Linq的联接运算,对两个List< T >,分别 inner join 和 left join 联接,以此为例,进行实例详解,代码也是自己编写,亲测通过的,可以直接拿着当demo使用。
联接是指将一个数据源对象与另一个数据源对象进行关联和联合操作。这两个数据源对象通过一个共同的值和属性进行关联。
在联接的过程中,可以使用两个语法进行联接,一种是直接使用查询方法,另一种是使用查询表达式,均可达到联接的效果。
Linq Left Join 实例
inner join比较简单,直接使用我 语法详解中的语法就可以了。GroupJoin 左联接 在此处给出实例
悄悄告诉你,直接粘贴到编译器中,可以直接运行哦~~~
/// <summary>
/// C#控制台应用程序
/// 学习Linq left join 使用
/// author : by wys
/// </summary>
// 假装 是一个 实体集
public class TestLinq
{
public string Time { get; set; }
public int Temp { get; set; }
public int ID { get; set; }
}
// 然后有两个要联接的集合,注意集合2缺了两天的数据哦。
List<TestLinq> list1 = new List<TestLinq>();
List<TestLinq> list2 = new List<TestLinq>();
// 集合1
list1.Add(new TestLinq { Time = "20170016", Temp = 16 });
list1.Add(new TestLinq { Time = "20170015", Temp = 15 });
list1.Add(new TestLinq { Time = "20170014", Temp = 14 });
list1.Add(new TestLinq { Time = "20170013", Temp = 13 });
list1.Add(new TestLinq { Time = "20170012", Temp = 12 });
//集合2 缺少两天数据
list2.Add(new TestLinq { Time = "20170016", ID = 1 });
list2.Add(new TestLinq { Time = "20170015", ID = 2 });
list2.Add(new TestLinq { Time = "20170012", ID = 3 });
//最终目标: 我要将 集合2中的ID 属性,嫁接到 集合1中
//使用查询语句
var list = from left in list1
join right in list2 on left.Time equals right.Time into temp
select new TestLinq {
Time = left.Time,
Temp = left.Temp,
ID = temp.Select(t => t.ID).FirstOrDefault()
};
//使用查询方法,均可使用
//var list = list1.GroupJoin(list2, left => left.Time, right => right.Time,
// (left, temp) => new TestLinq()
// {
// Time = left.Time,
// Temp = left.Temp,
// ID = temp.Select(t => t.ID).FirstOrDefault()
// });
//查看运行结果:
foreach (var item in list)
{
Console.WriteLine("{0}----{1}-----{2}", item.Time, item.Temp, item.ID);
}
Linq联接语法
查询方法 | 查询表达式 | 语法说明 |
---|---|---|
Join | join… in… on …equals… | 内部联接。类似于T-SQL 中的inner join。 |
GroupJoin | join…in…on…equals…into… | 分组联接,类似于T-SQL中的left join or right join,常用于返回“主键对象-外键对象集合形式查询。 |
Join
:(简而言之,就是提取公共部分) 他根据键值选择器函数联接两个数据集,只返回那些在另一个数据集中具有匹配项的对象并提取值对。
//使用查询语句
var list = from T1 in dataSource1
join T2 in dataSource2 on T1.ID equals T2.ID
select new {Name = T1.Name,ID=T1.ID,NickName = T2.NickName};
//使用查询方法
var list = dataSource1.Join(dataSource2,T1 => T1.ID,T2 => T2.ID, (T1,T2) => new {
Name = T1.Name,
ID=T1.ID,
NickName = T2.NickName
});
//补充:结果没有区别,习惯用那种就用那种。
GroupJoin
: 结果序列是 将左侧集合中元素 和右侧数据集中的一个或多个匹配元素相关联,如果在右侧元素中找不到与左侧元素数据集中元素相匹配的元素,则join子句会为该项产生一个空数组。
//查询表达式
var list = from left in dataSource1
join right in dataSource2 on left.ID = right.ID into tempArray
select new {
Name = left.Name,
ID=left.ID,
NickName = tempArray.select(t => t.NickName).FirstOrDefault()};
//此处的left,right 只是一个名字,方便你理解左右联接,并不是关键字
//难点(个人理解):
1、经多次调试发现,每次查询,实际将 right中 的匹配结果 放到了 tempArray 这个数组里,然后联接在一起。
2、如果右侧找不到左侧的相关匹配,这时 tempArray 将为空,但是他仍然是一个数据集数组,所以我们要选出相应的属性,因为他是一个相关数组,所以我们取了第一个。
- 3、匹配结果如果有多个,此时 tempArray 是个多个实体集的数组,所以我们可以直接进行 汇总计算,比如说 tempArray.Sum(t => t.price)