LINQ中的Join对应T-SQL中的内连接,并无左连接的方法,当然也没有右连接。
要达成Left join必须依靠GroupJoin来完成。
GroupJoin顾名思义就是先集团在做加入,加入的不同处在于加入会得到一个一对一的新物件集合(List <T>),而GroupJoin则会得到一对多的物件集合({key,List < T>})。
以下是join与GroupJoin的比较
资料表如图:ID = 004无可对应的资料
var _Join = SLIST.Join(ScoreList, o => o.ID, p => p.StudentID, (o, c) => new { o.Classroom, o.ID,o.Name, c.Class,c.score });
ID=004 不會在結果集合中
var _GroupJoin = SLIST.GroupJoin(ScoreList, o => o.ID, p => p.StudentID, (o, c) => new { o.Classroom, o.ID, c }); // C只能以泛型物件的方式存入,不能列举属性
物件Ç会比对关键值各自存入
可以看GroupJoin可以得到与Left Join相似的结果
接下来只要使用SelectMany将GroupJoin中的内容展开
//将矩阵展开并输出Null得到left join资料集 var _GroupJoinToLeftJoin = SLIST.GroupJoin(ScoreList, o => o.ID, p => p.StudentID, (o, c) => new { o.Classroom, o.ID,o.Name, c }).SelectMany(o => o.c.DefaultIfEmpty(), (o, c) => new { o.ID, o.Classroom,o.Name,Class=(c==null||c.Class==null?"N/A":c.Class), score= (c == null || c.score == null ? new Nullable<ushort>() : c.score) }); // SelectMany展开矩阵的内容 //使用DefaultIfEmpty因匿名型别无法输出NULL(无法转换成强型别),需特别注意Null的处理
输出结果