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>
- 把多个值连成一个值来分组
代码:
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)
{
//其它代码
}
}
- 嵌套分组,要按几个值分组就嵌套几次
代码:
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)
{
//其它代码
}
}
}
不知大家有什么别的好的方法,多交流!
浙公网安备 33010602011771号