public void UpdateLinksFromTableJoins()
        {
            // direct populate FromTableLinks
            NeedRedrawLinks = true;
            SelectedQuery.FromTableLinks = new List <TableLink>();

            foreach (var fj in SelectedQuery.FromTableJoins.Where(f => !f.IsDeleted))
            {
                var join    = fj.Source;
                var pt      = SelectedQuery.FromTables.First(t => t.Alias == join.LeftObjectAlias);
                var pk      = pt.Properties.First(p => p.Name == join.LeftField);
                var pkIndex = pt.Properties.IndexOf(pk);

                var ft      = SelectedQuery.FromTables.First(t => t.Alias == join.RightObjectAlias);
                var fk      = ft.Properties.First(p => p.Name == join.RightField);
                var fkIndex = ft.Properties.IndexOf(fk);

                var link = new TableLink
                {
                    PrimaryRefId = GenerateObjectId("table_primary", pt.Id, pkIndex),
                    ForeignRefId = GenerateObjectId("table_foreign", ft.Id, fkIndex),
                    Source       = join
                };

                SelectedQuery.FromTableLinks.Add(link);
            }
        }
        public void RegenerateTableLinks()
        {
            FromTableLinks = new List <TableLink>();
            var joins = GenerateJoins();

            var newJoins = joins.Where(j => !FromTableJoins.Any(f => f.Source.GetJoinString() == j.GetJoinString()));

            FromTableJoins.AddRange(newJoins.Select(j => new TableJoinModel {
                Source = j, JoinType = "Inner"
            }));
            var lostJoins = FromTableJoins.Where(j => !FromTables.Any(t => t.Alias == j.Source.LeftObjectAlias) || !FromTables.Any(t => t.Alias == j.Source.RightObjectAlias));

            FromTableJoins = FromTableJoins.Except(lostJoins).ToList();

            foreach (var fj in FromTableJoins.Where(f => !f.IsDeleted))
            {
                var join    = fj.Source;
                var pt      = FromTables.First(t => t.Alias == join.LeftObjectAlias);
                var pk      = pt.Properties.First(p => p.StoreProperty.Name == join.LeftField);
                var pkIndex = pt.Properties.IndexOf(pk);

                var ft      = FromTables.First(t => t.Alias == join.RightObjectAlias);
                var fk      = ft.Properties.First(p => p.StoreProperty.Name == join.RightField);
                var fkIndex = ft.Properties.IndexOf(fk);

                var link = new TableLink
                {
                    PrimaryRefId = GenerateObjectId("table_primary", pt.Id, pkIndex),
                    ForeignRefId = GenerateObjectId("table_foreign", ft.Id, fkIndex),
                    Source       = join
                };

                FromTableLinks.Add(link);
            }
        }