Linq连接两个ListT列表实例详解(Linqinnerjoin,leftjoin)
本章节主要介绍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,
sql left join 多表连接// 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
:(简⽽⾔之,就是提取公共部分) 他根据键值选择器函数联接两个数据集,只返回那些在另⼀个数据集中具有匹配项的对象并提取值
对。
GroupJoin
: 结果序列是 将左侧集合中元素 和右侧数据集中的⼀个或多个匹配元素相关联,如果在右侧元素中不到与左侧元素数据集中元素相匹配的元素,则join⼦句会为该项产⽣⼀个空数组。//难点(个⼈理解):1、经多次调试发现,每次查询,实际将 right中 的匹配结果 放到了 tempArray 这个数组⾥,然后联接在⼀起。
2、如果右侧不到左侧的相关匹配,这时 tempArray 将为空,但是他仍然是⼀个数据集数组,所以我们要选出相应的属性,因为他是⼀个相关数组,所以我们取了第⼀个。
3、匹配结果如果有多个,此时 tempArray 是个多个实体集的数组,所以我们可以直接进⾏ 汇总计算,⽐如说 tempArray.Sum(t =>t.price)
//使⽤查询语句
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
});
//补充:结果没有区别,习惯⽤那种就⽤那种。
//查询表达式
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 只是⼀个名字,⽅便你理解左右联接,并不是关键字
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论