• 勇在天涯   2014/7/28 12:56:00
  • Linq查询的分组查询问题
  • 关键字: linq groupby 分组
  • LINQ提供了类SQL的查询,非常方便有效,但应用LINQ进行分组(GroupBy)查询时,与SQL有些不同,不能直接按二个二个以后的值进行分组,因为分组后的值是IGrouping<TKey,TElement>类型的,LINQ语句中GROUP后面的值对应该于IGrouping<TKey,TElement>类型的里的TKey,分组后的一组记录只可能有一个键值,所以GROUP只能按一个值进行分组,这通常会给编程带来不便。

    现想到二种方法来实现按多个值分组的功能:

    以XLINQ为例,比如有以下一个XML文件,希望按XElement的二个属性来分组:

    <?xml version="1.0" encoding="utf-8" ?>

    <books>

     <book author="simon" language="chn">

        <price>22</price>

        <pages>123</pages>

     </book>

     <book author="vera" language="ens">

        <price>45</price>

        <pages>345</pages>

     </book>

     <book author="simon" language="ens">

        <price>66</price>

        <pages>454</pages>

     </book>

     <book author="vera" language="chn">

        <price>34</price>

        <pages>234</pages>

     </book>

     <book author="vera" language="jap">

        <price>43</price>

        <pages>431</pages>

     </book>

     <book author="vera" language="jap">

        <price>33</price>

        <pages>331</pages>

     </book>

    </books>
    1.把多个值连成一个值来分组 

     代码:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    private static void CombineValue()    {       
          XDocument xdoc = XDocument.Load(@"D:"studyexample"linqgrouptest"Books.xml");
                var books = from book in xdoc.Root.Elements("book")
                            group book by book.Attribute("author").Value +     book.Attribute("language").Value into g
                            select new { Group = g.Key, Member = g };
                foreach (var book in books)
                {
                    //其它代码
                }
            }
    2.嵌套分组,要按几个值分组就嵌套几次 

    代码:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    private static void NestGroup()
            {
                XDocument xdoc = XDocument.Load(@"D:"studyexample"linqgrouptest"Books.xml");
                var books = from book in xdoc.Root.Elements("book")
                            group book by book.Attribute("author").Value into g
                            select new { Group = g.Key, Member = g };
                foreach (var book in books)
                {
                string key = book.Group;
                    var sbook = from b in book.Member
                                group b by b.Attribute("language").Value into g2
                                select new { Group2 = g2.Key, Member2 = g2 };
                    foreach (var b in sbook)
                    {
    //其它代码
                   }
                }
            }



    不知大家有什么别的好的方法,多交流!