LINQ: Как получить свойства родительских типов при получении их дочерних коллекций

#c# #linq

#c# #linq

Вопрос:


У меня есть коллекция родительских типов, которая содержит список дочерних типов:


 public class ParentType
{

    public int ID;
    public string Name;
    public List<ChildType> ChildTypes { get; set; }

}

public class ChildType
{

    public int ID;
    public string Name;

}
  

Мне нужно использовать LINQ, чтобы превратить их в коллекцию следующего типа:


 public class MixedType
{

    public int ParentID;
    public string ParentName;
    public int ChildID;
    public string ChildName;

}
  

Я уже пробовал (выберите много), но не смог получить свойства родительского типа.

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

1. Используете ли вы linq для sql или entity framework?

Ответ №1:

При условии, что я понимаю, что вы собираетесь делать, вы должны использовать эту перегрузку расширения SelectManay, которое позволяет вам вызывать функцию выбора результата для каждого элемента в нем.

Запрос должен быть:

 var lst = new List<ParentType>();

var query = lst.SelectMany(p => p.ChildTypes, 
                                (parent, child) => new { parent, child }
                          )
               .Select(p => new MixedType
                            {
                                ChildID = p.child.ID,
                                ChildName = p.child.Name,
                                ParentID = p.parent.ID,
                                ParentName = p.parent.Name
                            });
  

Удачи!

Ответ №2:

 from p in parents
from c in p.Children
select new MixedType(...)
  

Должно сработать.

Ответ №3:

Я полагаю, вы пытаетесь спроецировать коллекцию MixedType из одного экземпляра ParentType

 var parent = new ParentType();

var mixedList = parent.ChildTypes
                  .Select(c => new MixedType
                  {
                     ParentID = parent.ID,
                     ParentName = parent.Name,
                     ChildID = c.ID,
                     ChildName = c.Name

                  });
  

Ответ №4:

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

 var mixed = 
    from child in parent.ChildTypes 
    select new MixedType 
    { 
        ParentID = parent.ID,
        ParentName = parent.Name,
        ChildID = child.ID, 
        ChildName = child.Name
    };
  

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

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