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