Список детей с родителями конвертируется в родителя со списком детей - PullRequest
1 голос
/ 23 ноября 2011

У меня есть несколько моделей, настроенных следующим образом:

public class Form
{
    public int FormId { get; set; }
    public virtual ICollection<SubForm> SubForms{ get; set; }
}
public class SubForm
{
    public int SubFormId { get; set; }
    public virtual Form Form {get; set;}
}

У меня есть такой список:

List<SubForm> subForms; <-- already populated, each subform has a form parent.

Как получить его в оптимальном формате (предпочтительно лямбда)

List<Form> formsWithChildren;

Ответы [ 3 ]

1 голос
/ 23 ноября 2011
formsWithChildren = subForms.Select(x => x.Form).Distinct().ToList();

Это то, что вы имеете в виду?

0 голосов
/ 23 ноября 2011

Вы можете группировать по FormId, а затем назначать сгруппированные подчиненные формы каждому новому элементу Form следующим образом:

var formsWithChildren = subForms.GroupBy(s => s.Form.FormId)
                                .Select(g => new Form
                                {
                                    FormId = g.Key,
                                    SubForms = g.ToList()
                                }).ToList();

РЕДАКТИРОВАТЬ : если существуют другие свойства, вам придется отображать их в инициализаторе объекта, но это может стать утомительным, и это не лучший вариант, если вы собираетесь повторно использовать этот тип запроса в другие сценарии. Я предлагаю создать новый Form объект и отобразить его, используя AutoMapper .

Если вы решите использовать AutoMapper, подход будет аналогичен следующему:

var formsWithChildren = new List<Form>();
foreach (var item in subForms.GroupBy(s => s.Form))
{
    Form f = Mapper.Map<Form, Form>(item.Key);
    f.SubForms = item.Select(s => s).ToList();
    formsWithChildren.Add(f);
}

Чтобы узнать больше, обратитесь на сайт AutoMapper .

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

var formsWithChildren = new List<Form>();
foreach (var item in subForms.GroupBy(s => s.Form))
{
    // re-use existing Form from grouping so it retains its assigned values
    Form f = item.Key;
    f.SubForms = item.Select(s => s).ToList();
    formsWithChildren.Add(f);
}

В обоих подходах, показанных выше, вам нужно реализовать Equals в классе Form, чтобы GroupBy Form вместо FormId:

public class Form
{
    public int FormId { get; set; }
    public virtual ICollection<SubForm> SubForms{ get; set; }

    public override bool Equals(object obj)
    {
        if (obj == null)
            return false;

        Form f = obj as Form;            
        return this.Equals(f);
    }

    public bool Equals(Form f)
    {
        if (f == null)
            return false;

        return this.FormId == f.FormId;
    }

    public override int GetHashCode()
    {
        return this.FormId.GetHashCode();
    }
}

Вы можете расширить методы равенства и GetHashCode, чтобы использовать свойства для определения уникальности. В настоящее время он опирается только на FormId.

0 голосов
/ 23 ноября 2011

Метод без создания новых объектов формы:

        //Populate subForms list of the forms
        subForms.GroupBy(x => x.Form).ForEach(x => x.Key.SubForms = x.ToList());
        //Select forms
        var forms = subForms.Select(x => x.Form).Distinct().ToList();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...