I have to generate family tree structure so i am using "ErikGartner/dTree" for display family tree. I am using SQL database to store and retrieve family tree. for combine all data i make view-model
public class TreeDataViewModel
{
public int rootID { get; set; }
public string name { get; set; }
[Column("class")]
public string @class { get; set; }
public string textClass { get; set; } = "emphasis";
public int? extraID { get; set; }
public int? marriagesID { get; set; }
public List<Marriage> marriages { get; set; }
public virtual Extra extra { get; set; }
}
public class Root
{
public int rootID { get; set; }
public string name { get; set; }
[Column("class")]
public string @class { get; set; }
public string textClass { get; set; } = "emphasis";
public int? extraID { get; set; }
public int? marriagesID { get; set; }
public List<Marriage> marriages { get; set; }
public virtual Extra extra { get; set; }
}
public class Spouse
{
public int spouseID { get; set; }
public string name { get; set; }
[Column("class")]
public string @class { get; set; }
public string textClass { get; set; } = "emphasis";
public int? extraID { get; set; }
public virtual Extra extra { get; set; }
}
public class Marriage
{
public int marriageID { get; set; }
public int? spouseID { get; set; }
public int? childID { get; set; }
public List<Child> children { get; set; }
public virtual Spouse spouse { get; set; }
}
public class Child
{
public int childID { get; set; }
public string name { get; set; }
[Column("class")]
public string @class { get; set; }
public string textClass { get; set; } = "emphasis";
public int? marriagesID { get; set; }
public int? extraID { get; set; }
public int? spouseID { get; set; }
public List<Marriage> marriages { get; set; }
public Extra extra { get; set; }
}
public class Extra
{
public int extraID { get; set; }
public string img { get; set; }
public string birthdate { get; set; }
}
In controller side i done this code :
public ActionResult Index()
{
TreeDataViewModel treeData = new TreeDataViewModel();
ViewModel.Root root = new ViewModel.Root();
ViewModel.Extra extra = new ViewModel.Extra();
ViewModel.Extra extra1 = new ViewModel.Extra();
ViewModel.Extra extra2 = new ViewModel.Extra();
ViewModel.Spouse sp = new ViewModel.Spouse();
ViewModel.Spouse sp2 = new ViewModel.Spouse();
int isRootNode = 0;
var extraModel = from ext in db.Extras select ext;
var spouseModel = from exta in db.Extras
join sps in db.Spouses on exta.extraID equals sps.extraID
select sps;
var marrigeModel = from spss in db.Spouses
join mm in db.Marriages on spss.spouseID equals mm.spouseID
join spmm in db.Spouses on mm.spouseID equals spmm.spouseID
select new { mm.marriageID, mm.spouseID, mm.childID };
var childModel = from ch in db.Children
select ch;
var rootModel = from extrt in db.Extras
join rt in db.Roots on extrt.extraID equals rt.extraID
join mmrt in db.Marriages on rt.marriagesID equals mmrt.marriageID
select rt;
List<ViewModel.Marriage> marriage = new List<ViewModel.Marriage>();
List<ViewModel.Marriage> marriageRt = new List<ViewModel.Marriage>();
List<ViewModel.Marriage> marriageChild = new List<ViewModel.Marriage>();
List<ViewModel.Marriage> marriageChildMarriage = new List<ViewModel.Marriage>();
List<ViewModel.Child> child = new List<ViewModel.Child>();
List<ViewModel.Child> childRt = new List<ViewModel.Child>();
if (rootModel != null && rootModel.Any())
{
foreach (var itemExtra in extraModel)
{
if (itemExtra.extraID == rootModel.FirstOrDefault().extraID)
{//root extra data
extra.extraID = itemExtra.extraID;
extra.img = itemExtra.img;
extra.birthdate = itemExtra.birthdate;
}
}
if (marrigeModel != null && marrigeModel.Any())
{
foreach (var itemMarraigeMain in marrigeModel)
{
if (isRootNode == 0)
{
foreach (var itemMarrige in marrigeModel)
{
if (itemMarrige.marriageID == rootModel.FirstOrDefault().marriagesID)
{
foreach (var itemSpouse in spouseModel)
{//spouse of root
#region Spouse of root
if (itemSpouse.spouseID == itemMarrige.spouseID)
{
foreach (var itemSpExtra in extraModel)
{
if (itemSpExtra.extraID == itemSpouse.extraID)
{
extra1.img = itemSpExtra.img;
extra1.birthdate = itemSpExtra.birthdate;
extra1.extraID = itemSpExtra.extraID;
}
}
sp.name = itemSpouse.name;
sp.@class = itemSpouse.@class;
sp.textClass = itemSpouse.textClass;
sp.spouseID = itemSpouse.spouseID;
sp.extraID = itemSpouse.extraID;
sp.extra = extra1;
}
#endregion
}
#region child of root
foreach (var itemChild in childModel)
{
if (itemChild.spouseID == sp.spouseID)
{
foreach (var itemChildExtra in extraModel)
{
if (itemChild.extraID == itemChildExtra.extraID)
{
extra2.img = itemChildExtra.img;
extra2.birthdate = itemChildExtra.birthdate;
}
}
foreach (var itemRootChildMarraiage in marrigeModel)
{
if (itemRootChildMarraiage.marriageID == itemChild.marriagesID)
{
foreach (var itemRootChildMMSpouse in spouseModel)
{
if (itemRootChildMMSpouse.spouseID == itemRootChildMarraiage.spouseID)
{
sp2.name = itemRootChildMMSpouse.name;
sp2.@class = itemRootChildMMSpouse.@class;
sp2.textClass = itemRootChildMMSpouse.textClass;
}
}
marriageChildMarriage.Add(new ViewModel.Marriage
{
spouseID = itemRootChildMarraiage.spouseID,
childID = itemRootChildMarraiage.childID,
spouse = sp2
});
}
}
childRt.Add(new ViewModel.Child
{
name = itemChild.name,
@class = itemChild.@class,
textClass = itemChild.textClass,
marriagesID = itemChild.marriagesID,
extraID = itemChild.extraID,
extra = extra2,
marriages = marriageChildMarriage
});
}
}
#endregion
marriageRt.Add(new ViewModel.Marriage
{//root spouse and list of childs
marriageID = itemMarrige.marriageID,
spouseID = itemMarrige.spouseID,
childID = itemMarrige.childID,
spouse = sp,
children = childRt
});
}
}
isRootNode = 1;
}
}
}
foreach (var item in rootModel)
{
treeData.name = item.name;
treeData.@class = item.@class;
treeData.marriages = marriageRt;
treeData.extra = extra;
}
}
string json = JsonConvert.SerializeObject(treeData);
ViewBag.jsonData = json;
return View();
}
However i manage to print Root parent with three children along with wife, but problem is all Three children get same class of spouse and extra. So it print all three children and same wife and extra information. The format that i have to convert in json so print family tree using dtree js. format of json is
treeData = [{
"name": "Niclas Superlongsurname", //node 1
"class": "man",
"textClass": "emphasis",
"extra": { "img": "https://cdn.balkan.app/shared/m60/2.jpg", "birthdate": "11-02-1960" },
"marriages": [{
"spouse": {
"name": "Iliana", // node 2
"class": "woman",
"textClass": "emphasis",
"extra": {
"nickname": "Illi",
"img": "https://cdn.balkan.app/shared/w60/1.jpg", "birthdate": "11-02-1966"
}
},
"children": [{
"name": "James", // node 3
"class": "man",
"textClass": "emphasis",
"marriages": [{
"spouse": {
"name": "Alexandra", // node 4
"class": "woman",
"textClass": "emphasis",
},
"children": [{
"name": "Eric", //node 5
"class": "man",
"textClass": "emphasis",
"marriages": [{
"spouse": {
"name": "Eva", //node 6
"class": "woman",
"textClass": "emphasis",
}
}]
}, {
"name": "Jane", //node 7
"class": "woman",
"textClass": "emphasis",
}, {
"name": "Jasper", //node 8
"class": "man",
"textClass": "emphasis",
}, {
"name": "Emma", //node 9
"class": "woman",
"textClass": "emphasis",
}, {
"name": "Julia", //node 10
"class": "woman",
"textClass": "emphasis",
}, {
"name": "Jessica", //node 11
"class": "woman",
"textClass": "emphasis",
}]
}]
}]
}]
Which would be format of loop for print this kind of json? Please response with Any suggestions ?