• LINQ学习笔记 Join 与 Group join


    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的处理

     输出结果

     

     

     

  • 相关阅读:
    【转自己的落谷博客】联通块的dfs
    STL中map的简单使用&常数优化
    转自自己的关于落谷计数器【p1239】的题解
    计算机网络三种模型
    docker的常用的一些配置
    容器整体性理解
    如何在类中定义装饰器?
    如何实现属性可修改的函数装饰器?
    如何定义带参数装饰器?
    如何为被装饰的函数保存元数据?
  • 原文地址:https://www.cnblogs.com/CnKker/p/10399117.html
Copyright © 2020-2023  润新知