导航

 

      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. 把多个值连成一个值来分组

 代码:

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)

            {

                //其它代码

            }

        }

  1. 嵌套分组,要按几个值分组就嵌套几次

代码:

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)

                {

//其它代码

               }

            }

        }

 

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