private void AddSearchColumn(List <EntitySearchColumnsDTO> list, ColumnDTO column, string relationshipPath = null, List <RelationshipDTO> relationships = null)
        {
            var resultColumn = new EntitySearchColumnsDTO();

            resultColumn.ColumnID = column.ID;
            resultColumn.Column   = column;
            resultColumn.CreateRelationshipTailPath    = relationshipPath;
            resultColumn.AllRelationshipsAreSubToSuper = relationships != null && relationships.All(x => x.TypeEnum == Enum_RelationshipType.SubToSuper || x.TypeEnum == Enum_RelationshipType.SubUnionToUnion);
            string entityAlias = "";

            if (relationships == null || relationships.Count == 0)
            {
                entityAlias = "";
            }
            else if (resultColumn.AllRelationshipsAreSubToSuper)
            {
                entityAlias = "";
            }
            else
            {
                var firstNotISAOrUnionEntity = GetLastNotISAOrUnionRelationship(relationships);
                if (firstNotISAOrUnionEntity != null)
                {
                    entityAlias = firstNotISAOrUnionEntity.Entity2Alias + ".";
                }
            }
            resultColumn.Alias = entityAlias + column.Alias;
            list.Add(resultColumn);
        }
        private void SetColumns(EntitySearchColumnsDTO condition)
        {
            colColumns.DisplayMemberPath       = "Name";
            colColumns.SelectedValueMemberPath = "ID";
            BizTableDrivedEntity biz = new BizTableDrivedEntity();

            if (condition.RelationshipTailID == 0)
            {
                var entity = biz.GetTableDrivedEntity(MyProjectManager.GetMyProjectManager.GetRequester(), EntityID, EntityColumnInfoType.WithSimpleColumns, EntityRelationshipInfoType.WithoutRelationships);
                condition.vwValueColumns = entity.Columns;;
            }
            else
            {
                var relationshipTail = bizEntityRelationshipTail.GetEntityRelationshipTail(MyProjectManager.GetMyProjectManager.GetRequester(), condition.RelationshipTailID);
                var entity           = biz.GetTableDrivedEntity(MyProjectManager.GetMyProjectManager.GetRequester(), relationshipTail.TargetEntityID, EntityColumnInfoType.WithSimpleColumns, EntityRelationshipInfoType.WithoutRelationships);
                condition.vwValueColumns = entity.Columns;
            }
        }
        private EntitySearchDTO ToEntitySimpleSearch(TableDrivedEntityDTO entityDTO)
        {
            EntitySearchDTO result = new EntitySearchDTO();

            result.TableDrivedEntityID = entityDTO.ID;
            result.ID    = 0;
            result.Title = "ستونهای ساخته شده";
            foreach (var column in entityDTO.Columns)
            {
                EntitySearchColumnsDTO rColumn = new EntitySearchColumnsDTO();
                rColumn.ID       = 0;
                rColumn.ColumnID = column.ID;
                rColumn.Column   = column;
                rColumn.Alias    = column.Alias;
                rColumn.OrderID  = (short)column.Position;
                result.EntitySearchAllColumns.Add(rColumn);
            }
            return(result);
        }
        private void AddRelationshipDefaultColumns(TableDrivedEntityDTO entity, List <TableDrivedEntityDTO> allEntities, List <EntitySearchColumnsDTO> list, string relationshipPath = "", List <RelationshipDTO> relationships = null)
        {
            var reviewedFKRels = new List <RelationshipDTO>();

            foreach (var column in entity.Columns)
            {
                if (entity.Relationships.Any(z => z.MastertTypeEnum == Enum_MasterRelationshipType.FromForeignToPrimary && z.RelationshipColumns.Any(y => y.FirstSideColumnID == column.ID)))
                {
                    var newrelationship = entity.Relationships.First(z => z.MastertTypeEnum == Enum_MasterRelationshipType.FromForeignToPrimary && z.RelationshipColumns.Any(y => y.FirstSideColumnID == column.ID));
                    if (newrelationship.TypeEnum == Enum_RelationshipType.SubToSuper ||
                        newrelationship.TypeEnum == Enum_RelationshipType.UnionToSubUnion)
                    {
                        if (!reviewedFKRels.Any(x => x.ID == newrelationship.ID))
                        {
                            reviewedFKRels.Add(newrelationship);
                            //جلوگیری از لوپ
                            if (relationships == null || !relationships.Any(x => x.ID == newrelationship.ID))
                            {
                                int isaID   = 0;
                                int uinonID = 0;
                                if (newrelationship.TypeEnum == Enum_RelationshipType.SubToSuper)
                                {
                                    isaID = (newrelationship as SubToSuperRelationshipDTO).ISARelationship.ID;
                                }
                                else if (newrelationship.TypeEnum == Enum_RelationshipType.UnionToSubUnion)
                                {
                                    uinonID = (newrelationship as UnionToSubUnionRelationshipDTO).UnionRelationship.ID;
                                }
                                if ((isaID == 0 || isaID != GetLastISAID(relationships)) &&
                                    (uinonID == 0 || isaID != GetLastUnionID(relationships)))
                                {
                                    List <RelationshipDTO> relationshipsTail = new List <RelationshipDTO>();
                                    if (relationships != null)
                                    {
                                        foreach (var relItem in relationships)
                                        {
                                            relationshipsTail.Add(relItem);
                                        }
                                    }
                                    relationshipsTail.Add(newrelationship);
                                    //کلید های خارجی موجودیت های دیگر مهم نیستند
                                    foreach (var relCol in newrelationship.RelationshipColumns)
                                    {
                                        if (!relCol.FirstSideColumn.PrimaryKey)
                                        {
                                            AddSearchColumn(list, relCol.FirstSideColumn, relationshipPath, relationships);
                                        }
                                    }
                                    GenereateDefaultSearchColumnsFromRelationship(newrelationship, allEntities, list, relationshipPath + (relationshipPath == "" ? "" : ",") + newrelationship.ID.ToString(), relationshipsTail);
                                }
                            }
                        }
                    }
                    else if (relationships == null)
                    {
                        var resultColumn = new EntitySearchColumnsDTO();
                        resultColumn.CreateRelationshipTailPath = relationshipPath + (relationshipPath == "" ? "" : ",") + newrelationship.ID.ToString();
                        resultColumn.Alias = newrelationship.Entity2Alias;
                        list.Add(resultColumn);
                    }
                }
            }

            foreach (var newrelationship in entity.Relationships.Where(x => x.MastertTypeEnum == Enum_MasterRelationshipType.FromPrimartyToForeign))
            {
                if (newrelationship.TypeEnum == Enum_RelationshipType.SubUnionToUnion ||
                    (newrelationship.TypeEnum == Enum_RelationshipType.SuperToSub && (newrelationship as SuperToSubRelationshipDTO).ISARelationship.IsTolatParticipation))
                {
                    //جلوگیری از لوپ
                    if (relationships == null || !relationships.Any(x => x.ID == newrelationship.ID))
                    {
                        int isaID   = 0;
                        int uinonID = 0;
                        if (newrelationship.TypeEnum == Enum_RelationshipType.SuperToSub)
                        {
                            isaID = (newrelationship as SuperToSubRelationshipDTO).ISARelationship.ID;
                        }
                        else if (newrelationship.TypeEnum == Enum_RelationshipType.SubUnionToUnion)
                        {
                            uinonID = (newrelationship as SubUnionToSuperUnionRelationshipDTO).UnionRelationship.ID;
                        }
                        if ((isaID == 0 || isaID != GetLastISAID(relationships)) &&
                            (uinonID == 0 || isaID != GetLastUnionID(relationships)))
                        {
                            List <RelationshipDTO> relationshipsTail = new List <RelationshipDTO>();
                            if (relationships != null)
                            {
                                foreach (var relItem in relationships)
                                {
                                    relationshipsTail.Add(relItem);
                                }
                            }
                            relationshipsTail.Add(newrelationship);
                            GenereateDefaultSearchColumnsFromRelationship(newrelationship, allEntities, list, relationshipPath + (relationshipPath == "" ? "" : ",") + newrelationship.ID.ToString(), relationshipsTail);
                        }
                    }
                }
            }
        }
        public EntitySearchDTO ToEntitySearchDTO(DR_Requester requester, EntitySearch item, bool withDetails)
        {
            EntitySearchDTO result = new EntitySearchDTO();

            result.TableDrivedEntityID = item.TableDrivedEntityID;
            result.ID    = item.ID;
            result.Title = item.Title;
            BizEntityRelationshipTail bizEntityRelationshipTail = new MyModelManager.BizEntityRelationshipTail();

            if (withDetails)
            {
                BizColumn bizColumn = new MyModelManager.BizColumn();
                foreach (var column in item.EntitySearchColumns)
                {
                    EntitySearchColumnsDTO rColumn = new EntitySearchColumnsDTO();
                    rColumn.ID       = column.ID;
                    rColumn.ColumnID = column.ColumnID ?? 0;
                    if (column.Column != null)
                    {
                        rColumn.Column = bizColumn.ToColumnDTO(column.Column, true);
                    }
                    if (column.ColumnID != null)
                    {
                        rColumn.Alias = column.Alias ?? column.Column.Alias ?? column.Column.Name;
                    }
                    else
                    {
                        rColumn.Alias = column.Alias ?? column.EntityRelationshipTail.TableDrivedEntity.Alias ?? column.EntityRelationshipTail.TableDrivedEntity.Name;
                    }
                    rColumn.OrderID = column.OrderID ?? 0;

                    //rColumn.WidthUnit = column.WidthUnit ?? 0;
                    if (column.EntityRelationshipTailID != null)
                    {
                        rColumn.RelationshipTailID = column.EntityRelationshipTailID.Value;
                        rColumn.RelationshipTail   = bizEntityRelationshipTail.ToEntityRelationshipTailDTO(column.EntityRelationshipTail);
                    }
                    if (!string.IsNullOrEmpty(column.Tooltip))
                    {
                        rColumn.Tooltip = column.Tooltip;
                    }
                    else
                    {
                        if (rColumn.RelationshipTail != null && rColumn.Column != null)
                        {
                            rColumn.Tooltip = rColumn.RelationshipTail.ReverseRelationshipTail.TargetEntityAlias + "." + rColumn.Column.Alias;
                        }
                    }
                    result.EntitySearchAllColumns.Add(rColumn);
                }
                //foreach (var tail in item.EntitySearchRelationshipTails)
                //{
                //    EntitySearchRelationshipTailDTO rTail = new EntitySearchRelationshipTailDTO();
                //    rTail.ID = tail.ID;
                //    rTail.EntityRelationshipTailID = tail.EntityRelationshipTailID;
                //    rTail.EntityRelationshipTail = bizEntityRelationshipTail.ToEntityRelationshipTailDTO(tail.EntityRelationshipTail);
                //    foreach (var tailColumn in tail.EntitySearchColumns)
                //    {
                //        rTail.EntitySearchColumns.Add(result.EntitySearchAllColumns.First(x => x.ID == tailColumn.ID));
                //    }
                //    result.EntitySearchRelationshipTails.Add(rTail);
                //}
            }
            ImposeSecurity(requester, result, item.TableDrivedEntity1);
            return(result);
        }