zoukankan      html  css  js  c++  java
  • 探讨复杂linq之group by 和 join

      最近经常用到集合,而且是大量使用集合,要再以前在使用这么多的集合肯定让我直接疯掉了,不过还好,有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一点也不复杂,最重要的就是针对逻辑需要理清思路。


     感谢阅读,请留下您的意见或疑问! 能力有限,错漏难免,欢迎指点!

     分割线:我的个人原创,请认准 http://freedong.cnblogs.com/ (转摘不标原文出处可耻)

  • 相关阅读:
    开源搜索引擎Solr的快速搭建及集成到企业门户最佳实施方案--转载
    Java开发WebService的几种方法--转载
    HBase Java简单示例--转载
    Eclipse快捷键大全--转载
    Java中List、Set和Map的区别--转载
    ArrayList和Iterator的用法
    日期格式化
    java中的值传递和引用传递问题
    Servlet,过滤器,监听器,拦截器的区别
    Java过滤器与SpringMVC拦截器之间的关系与区别
  • 原文地址:https://www.cnblogs.com/FreeDong/p/2626256.html
Copyright © 2011-2022 走看看