0

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 ?

siddhesh
  • 31
  • 4
  • I would suggest you to use Family Tree JS https://balkan.app/FamilyTreeJS and save you data in one simple flat table without complex relations – Plamen Peshev Feb 24 '23 at 08:16

0 Answers0