Запрос LINQ для сложных данных с группировкой

#linq

#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> вместо родительского типа данных <Data2> .

как я могу преобразовать этот дочерний тип данных в родительский тип данных после группировки

как я могу реализовать это в для каждого цикла.

Комментарии:

1. это XML? Если нет, можете ли вы вставить определение класса?

Ответ №1:

Если вам нужно сгруппировать сложные данные, то вы должны использовать GroupBy в Linq, а не использовать цикл for или для каждого

На есть несколько простых примеров группирования по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

Ответ №2:

Если я правильно понял ваш пост, вы ищете что-то вроде этого:

 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);
  

Это немного некрасиво, если вы хотите спроецировать, но таким образом сохраняйте ссылку на исходный элемент…

Элемент1 — это ваши полные данные, а Элемент2 — ваша текущая проекция. Вложенный цикл 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));
  

Комментарии:

1. привет, Подгузник, спасибо за твой ответ… Но я использую .Net 3.5, он не поддерживает Tuple. Create() . вот запрос, который я написал для GroupBy = objMedData.Data . Выберите(FB => FB.Data. GroupBy(FF=>FF.PrimaryInsuranceID)); я получил результат как объект данных, но мне нужен результат как ComplexData

2. @CEEYES: Вместо кортежей вы также можете использовать анонимные типы: new { ComplexData = x, Projection = y } .

3. hii Nappy, Можете ли вы прислать мне пример, аналогичный моей ситуации для этого типа. Потому что я новичок в LINQ….