C# 具有父对象的子对象列表转换为具有子对象列表的父对象

C# 具有父对象的子对象列表转换为具有子对象列表的父对象,c#,.net,lambda,C#,.net,Lambda,我有一些模型设置如下: 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;} }

我有一些模型设置如下:

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;}
}
        //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();
var formsWithChildren = subForms.GroupBy(s => s.Form.FormId)
                                .Select(g => new Form
                                {
                                    FormId = g.Key,
                                    SubForms = g.ToList()
                                }).ToList();
公共类表单
{
公共int FormId{get;set;}
公共虚拟ICollection子窗体{get;set;}
}
公共类子窗体
{
公共int子形式{get;set;}
公共虚拟表单{get;set;}
}
我有这样一份清单:

List<SubForm> subForms; <-- already populated, each subform has a form parent.
        //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();
列表子表单;
这就是你的意思吗

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

这就是您的意思吗?

不创建新表单对象的方法:

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

方法而不创建新表单对象:

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

您可以按
FormId
进行分组,然后将分组后的子表单分配给每个新的
Form
项,如下所示:

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;}
}
        //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();
var formsWithChildren = subForms.GroupBy(s => s.Form.FormId)
                                .Select(g => new Form
                                {
                                    FormId = g.Key,
                                    SubForms = g.ToList()
                                }).ToList();
编辑:如果存在其他属性,则必须在对象初始值设定项中映射它们,但这可能会变得单调乏味,如果您打算在其他场景中重用此类查询,这不是最佳选项。我建议创建一个新的
表单
对象,并使用

        //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();
如果您决定使用AutoMapper,方法将类似于此:

        //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();
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);
}

您可以扩展equality和
GetHashCode
方法来使用属性来确定唯一性。目前,它仅依赖于
FormId

您可以通过
FormId
进行分组,然后将分组的子表单分配给每个新的
表单
项,如下所示:

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;}
}
        //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();
var formsWithChildren = subForms.GroupBy(s => s.Form.FormId)
                                .Select(g => new Form
                                {
                                    FormId = g.Key,
                                    SubForms = g.ToList()
                                }).ToList();
编辑:如果存在其他属性,则必须在对象初始值设定项中映射它们,但这可能会变得单调乏味,如果您打算在其他场景中重用此类查询,这不是最佳选项。我建议创建一个新的
表单
对象,并使用

        //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();
如果您决定使用AutoMapper,方法将类似于此:

        //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();
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);
}

您可以扩展equality和
GetHashCode
方法来使用属性来确定唯一性。目前它只依赖于
FormId

子表单。选择(i=>i.Form)。Distinct()
,可能?
子表单。选择(i=>i.Form)。Distinct()
,可能?这会将相关子表单放在每个表单下吗?这会将相关子表单放在每个表单下吗?如果
表单中有其他属性怎么办?它们不会被复制如果
表单中有其他属性怎么办?它们不会被复制
        //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();