2016-09-30 3 views
1

Если у меня есть список внутри класса внутри списка, где классы определяются следующим образом:Как извлечь данные из списка родительских объектов с дочерними элементами?

class Class1 
{ 
    public int Id { get; set; } 

    public List<Class2> Class2s { get; set; } 
} 

class Class2 
{ 
    public string Name { get; set; } 

    public string Value { get; set; } 
} 

я могу создать список класса типа Result где Result является:

class Result 
{ 
    public int Class1Id { get; set; } 

    public string Name { get; set; } 

    public string Value { get; set; } 
} 

Обратите внимание, что класс Result содержит значения от Class1 и Class2.

Как так:

var results = new List<Result>(); 
foreach (var class1 in class1s) //class1s is a List of Class1 
{ 
    foreach (var class2 in class1.Class2s) 
    { 
     results.Add(new Result() 
     { 
      Class1Id = class1.Id, 
      Name = class2.Name, 
      Value = class2.Value, 
     }; 
    } 
} 

Как я могу сделать это с помощью запроса Linq?

Я попытался следующие:

IList<Result> list = class1s.Select(c => c.Class2s.Select(c2 => new Result() 
{ 
    Class1Id = c.Id, 
    Type = c2.Type, 
    Name = c2.Name, 
}).ToList()).ToList(); 

Но это терпит неудачу с ошибкой:

Cannot implicitly convert type 'System.Collections.Generic.List<System.Collections.Generic.List<Results>' to 'System.Collections.Generic.IList<Results>'. An explicit conversion exists (are you missing a cast?) 

Примечание:

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

+0

@CodeCaster и как я должен это делать с помощью SelectMany, когда одно из свойств находится во внешнем классе, а не в списке? – TheLethalCoder

+0

Предлагаю вам изменить заголовок и вопрос, чтобы объяснить, что вы хотите включить данные из родительских объектов. Как бы то ни было, немедленный ответ на «Как сгладить список списков» - «Use SelectMany». Одно важное отличие теряется в коде –

+1

У вас нет списка списков, у вас есть список родительских и дочерних объектов. –

ответ

4

Извлечение данных из списка родителей и детей можно легко сделать в формате запроса с помощью двух from заявления

var results = from parent in class1s 
       from child in parent.Class2s 
       select new Result { 
        Class1Id = parent.Id, 
        Name = child.Name, 
        Value = child.Value, 
       }; 
var list=results.ToList(); 

В беглом формате, вы можете использовать SelectMany

var list = class1s.SelectMany(parent => parent.Class2s, 
           (parent,child)=> 
              new Result { 
               Class1Id = parent.Id, 
               Name = child.Name, 
               Value = child.Value 
              } 
      ).ToList(); 

Я предпочитаю первая форма по очевидным причинам

Обратите внимание, что я использую перегрузку SelectMany, которая принимает селектор результатов. Без него я бы использовать Select внутри первой функции селектора, что приводит к еще более громоздкого кода

+0

Можно ли сделать это легко в другом формате (не помню его имени)? – TheLethalCoder

+0

Не * это * легко, поэтому я сначала его пробую.Кроме того, они эквивалентны –

+0

Я знаю, что они эквивалентны Я просто лично предпочитаю другой формат, но спасибо за вашу помощь – TheLethalCoder

2

Вы можете сделать это в формате без запроса с помощью следующего:

results = class1s.SelectMany(c => c.Class2s.Select(c2 => new Result() 
     { 
      Class1Id = c.Id, 
      Name = c2.Name, 
      Value = c2.Value, 
     })).ToList(); 

Обратите внимание, что это очень аналогично вашей первоначальной попытке, но с использованием SelectMany на class1s вместо Select.

+0

Нет необходимости в двойной выбор, 'SelectMany' имеет переопределение, которое принимает селектор результатов. –

+0

Это хороший момент @PanagiotisKanavos. Я оставлю это здесь как альтернативный подход, но поддержу ваш ответ, поскольку он более всеобъемлющий. – petelids

+0

Я тоже начал писать * эту * версию, но потом вспомнил, что иногда возникают неожиданные перегрузки, которые делают вещи намного проще –

Смежные вопросы