探讨复杂linq之group by 和 join

系统 1749 0

  最近经常用到集合,而且是大量使用集合,要再以前在使用这么多的集合肯定让我直接疯掉了,不过还好,有LINQ。一下做通过我们项目中的实际需求引出几个我本人使用较为复杂linq(其实说复杂不是因为linq语句复杂,而是业务需求麻烦)。

  第一个Demo,像SQL一样使用group by.先贴代码(代码直接粘贴的有点难看):

      var namequery = from b in

                                    (from a in approvalNodeDTOs

                                     group a by a.ApprovalNodeName into g

                                     select new { nodeName = g.Key, count = g.Count() })

                                where b.count > 1

                                select b.nodeName;


    

  这里approvalNodeDTOs表示一个列表,这条语句的目的是获取这个列表当中具有相同ApprovalNodeName(即为集合里item的类属性)属性值的记录的ApprovalNodeName。这样子以来避免了我们去写多条语句,其实这种写法优势并不明显,不过算是各有所好吧,多一个解决方案也可以让我们在今后碰到问题时有多一条思路。

  第二个Demo,先来看看我通过这个linq语句获得的数据集的代码吧。

      
        var
      
       queryTemp = 
      
        from
      
       a 
      
        in
      
      
         list

                           
      
      
        where
      
      
         a.ID.Equals(appID)

                            group a by a.USERID into g

                            
      
      
        select
      
      
        new
      
      
         { g.Key, g };

            
      
      
        var
      
       query = 
      
        from
      
       u 
      
        in
      
      
         users

                        join q 
      
      
        in
      
      
         queryTemp on u.I_USER_ID equals q.Key into temp

                        
      
      
        from
      
       q 
      
        in
      
      
         temp.DefaultIfEmpty()

                        
      
      
        select
      
      
        new
      
       { UserName = u.C_NAME, g = q == 
      
        null
      
       ? 
      
        null
      
       : q.g };
    
      第一个Linq语句获取的queryTemp是以UserID进行分组获取集合,在这里解释下g.Key表示的就是这个UserID,Key是我们使用group by时都会有的一个属性,而后面的g就表示获取的分组后的所有属性。
    
  第二个Linq语句使用了join,因为第一个语句所查询的list只是以Users表作为外键表,只关联到了userID,并没有Name,所以要进行连表查询。join后面紧跟的queryTemp相当于表示右连接,即只要queryTemp存在数据即返回布无论users是否有匹配数据。而DefaultIfEmpty方法,大家可参考MSDN( http://msdn.microsoft.com/zh-cn/library/bb356814.aspx )。
  最后说一下第二个Demo的需求,很简单,就是连表查询,但是首先需要分组,最终就是把分组后的集合中UserID字段用Name字段来替代。
  其实我这两个Demo一点也不复杂,最重要的就是针对逻辑需要理清思路。

探讨复杂linq之group by 和 join


更多文章、技术交流、商务合作、联系博主

微信扫码或搜索:z360901061

微信扫一扫加我为好友

QQ号联系: 360901061

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描下面二维码支持博主2元、5元、10元、20元等您想捐的金额吧,狠狠点击下面给点支持吧,站长非常感激您!手机微信长按不能支付解决办法:请将微信支付二维码保存到相册,切换到微信,然后点击微信右上角扫一扫功能,选择支付二维码完成支付。

【本文对您有帮助就好】

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描上面二维码支持博主2元、5元、10元、自定义金额等您想捐的金额吧,站长会非常 感谢您的哦!!!

发表我的评论
最新评论 总共0条评论