LINQ使用分组查询复杂数据

时间:2011-05-06 13:37:11

标签: linq

我有这种方式的复杂数据

<Complex Data>
      <Data Level 1>..........</Data>  (only single row)
      <Data>...................(n rows)
           <Data 2a>............</Data>  (only single row)
           <Data 2b>............</Data>  (n row)
           <Id></Id>.....................(unique key)
      </Data2>
</Complex Data>

我有一个复杂的数据LIST<COMPLEX DATA>。我需要使用<Data 2a.......eg: Place> </Data2a>

中的元素对这个复杂数据进行分组

我尝试实现此功能,但我只获得父数据类型为<Data 2a>的{​​{1}}子数据类型。

如何在分组后将此子数据类型转换为父数据类型

我如何在每个循环中实现这一点。

2 个答案:

答案 0 :(得分:0)

如果您需要对复杂数据进行分组,那么您应该在Linq中使用GroupBy而不是使用for或for each循环

http://msdn.microsoft.com/en-us/vbasic/bb738046有一些简单的小组例子 - 第一个例子(在VB中)应该涵盖你需要的东西吗?

或者,LinqToXml分组的本教程非常好:http://msmvps.com/blogs/martin_honnen/archive/2009/11/27/grouping-with-linq-to-xml.aspx

答案 1 :(得分:0)

如果我理解你的帖子,你正在寻找这样的东西:

var grouping = source
    .SelectMany(x => x.Items.Select(y => Tuple.Create(x, y))
    .SelectMany(t1 => t1.Item2.Items.Select(z => Tuple.Create(t1.Item1, z))
    .GroupBy(t2 => t2.Item2, t2 => t2.Item1);

如果你想投影它有点难看,但是这样保持对源元素的引用......

Item1是您的补全数据,Item2是您当前的投影。嵌套的foreach循环使其更具可读性:

IEnumerable<Tuple<K, TSource>> SelectManyKeys(IEnumerable<TSource> source)
{
    foreach (var x in source)
    {
         foreach (var k in x.Items.SelectMany(z => z.Items))
         {
             yield return Tuple.Create(k, x);
         }
    }
}

var grouping = SelectManyKeys(source).GroupBy(t => t.Item1, t => t.Item2));