private List <EntitySecurityDirectDTO> GetDirectSecurities(DR_Requester requester, OrganizationPostDTO post, IQueryable <EntitySecurityDirect> directSecurities, int entityID)
        {
            //var cachedItem = CacheManager.GetCacheManager().GetCachedItem(CacheItemType.EntityDirectSecurity, subjectID.ToString(), entityID.ToString());
            //if (cachedItem != null)
            //    return (cachedItem as List<EntitySecurityDirectDTO>);
            BizRoleSecurity bizRoleSecurity = new BizRoleSecurity();

            List <EntitySecurityDirectDTO> result = new List <EntitySecurityDirectDTO>();

            //////foreach (var directSecurity in directSecurities)
            //////{
            //////    bool hasAnyOfSubjects = false;
            //////    foreach (var subject in directSecurity.TableDrivedEntityState.)
            //////    {
            //////        if (post.CurrentUserID == subject.SecuritySubjectID
            //////            || post.ID == subject.SecuritySubjectID
            //////             || post.OrganizationID == subject.SecuritySubjectID
            //////              || post.OrganizationTypeID == subject.SecuritySubjectID
            //////               || post.OrganizationTypeRoleTypeID == subject.SecuritySubjectID
            //////                || post.RoleTypeID == subject.SecuritySubjectID
            //////                )
            //////            hasAnyOfSubjects = true;
            //////    }

            //////    if (directSecurity.SecuritySubjectOperator == null || (InORNotIn)directSecurity.SecuritySubjectOperator == InORNotIn.In)
            //////    {
            //////        if (hasAnyOfSubjects == true)
            //////            result.Add(bizRoleSecurity.ToEntitySecurityDirectDTO(requester, directSecurity, true));
            //////    }
            //////    else
            //////    {
            //////        if (hasAnyOfSubjects == false)
            //////            result.Add(bizRoleSecurity.ToEntitySecurityDirectDTO(requester, directSecurity, true));
            //////    }
            //////}
            ////////var subjectDisrectSecurities = directSecurities.Where(x => x.SecuritySubjectID == subjectID);// && x.Mode == (short)securityMode);
            ////////List<EntitySecurityDirectDTO> result = new List<EntitySecurityDirectDTO>();
            ////////foreach (var item in subjectDisrectSecurities)
            ////////{
            ////////    result.Add(bizRoleSecurity.ToEntitySecurityDirectDTO(requester, item, true));
            ////////}
            ////////     CacheManager.GetCacheManager().AddCacheItem(result, CacheItemType.EntityDirectSecurity, subjectID.ToString(), entityID.ToString());
            return(result);
        }
        public List <EntitySecurityDirectDTO> GetGeneralEntitySecurityItems(DR_Requester requester, int entityID)
        {
            var cachedItem = CacheManager.GetCacheManager().GetCachedItem(CacheItemType.EntityGeneralDirectSecurity, entityID.ToString());
            //   if (cachedItem != null)
            //       return (cachedItem as List<EntitySecurityDirectDTO>);
            BizRoleSecurity bizRoleSecurity       = new BizRoleSecurity();
            List <EntitySecurityDirectDTO> result = new List <EntitySecurityDirectDTO>();

            //////using (var context = new MyProjectEntities())
            //////{
            //////    var disrectSecurities = context.EntitySecurityDirect.Where(x => x.TableDrivedEntityID == entityID && x.Mode == (short)DataDirectSecurityMode.FetchData);

            //////    var subjectDisrectSecurities = disrectSecurities.Where(x => !x.EntitySecurityDirectSecuritySubject.Any());
            //////    foreach (var item in subjectDisrectSecurities)
            //////    {
            //////        result.Add(bizRoleSecurity.ToEntitySecurityDirectDTO(requester, item, true));
            //////    }
            //////}
            CacheManager.GetCacheManager().AddCacheItem(result, CacheItemType.EntityGeneralDirectSecurity, entityID.ToString());
            return(result);
        }
        //public void UpdateEntitySecurityInDirect(EntitySecurityInDirectDTO message)
        //{
        //    using (var projectContext = new DataAccess.MyProjectEntities())
        //    {
        //        var dbItem = projectContext.EntitySecurityInDirect.FirstOrDefault(x => x.ID == message.ID);
        //        if (dbItem == null)
        //        {
        //            dbItem = new DataAccess.EntitySecurityInDirect();
        //            projectContext.EntitySecurityInDirect.Add(dbItem);
        //        }
        //        dbItem.Mode = (short)message.Mode;
        //        dbItem.TableDrivedEntityID = message.TableDrivedEntityID;
        //        dbItem.EntityRelationshipTailID = message.RelationshipTailID;
        //        projectContext.SaveChanges();
        //    }
        //}
        public EntityStateDTO GetAppliableConditionsBySecuritySubject(DR_Requester requester, int entityID, DataDirectSecurityMode mode)
        {
            //var cachedItem = CacheManager.GetCacheManager().GetCachedItem(CacheItemType.ConditionalPermission, securitySubjectID.ToString(), entityID.ToString());
            //if (cachedItem != null)
            //    return (cachedItem as List<ConditionalPermissionDTO>);
            //List<int> organizationTypeIDs = new List<int>();
            //List<int> organizationIDs = new List<int>();
            //List<int> roleTypeIDs = new List<int>();
            //List<int> orgTypeRoleTypeIDs = new List<int>();
            //Tuple<EntitySecurityInDirectDTO, List<EntitySecurityDirectDTO>> result;= new Tuple<EntitySecurityInDirectDTO, List<EntitySecurityDirectDTO>>();

            BizRoleSecurity bizRoleSecurity = new BizRoleSecurity();
            List <EntityStateConditionDTO> entityStateConditions = new List <EntityStateConditionDTO>();

            //  EntitySecurityInDirectDTO indisrectSecurityDTO = null;
            //   EntityStateDTO entityState = null;
            using (var context = new MyProjectEntities())
            {
                var directSecurityEntityID      = entityID;
                var targetEntityDisrectSecurity = GetEntitySecurityDirectByEntityID(requester, entityID, mode, true);
                if (targetEntityDisrectSecurity == null)
                {
                    //var indisrectSecurity = GetEntitySecurityInDirect(context.EntitySecurityInDirect.FirstOrDefault(x => x.TableDrivedEntityID == entityID);
                    //if (indisrectSecurity == null)
                    //    return null;
                    //else
                    //{
                    //    indisrectSecurityDTO = bizRoleSecurity.ToEntitySecurityInDirectDTO(indisrectSecurity, true);
                    //    var targetEntity = indisrectSecurity.EntityRelationshipTail.TableDrivedEntity;
                    //    directSecurityEntityID = targetEntity.ID;
                    //    targetEntityDisrectSecurity = context.EntitySecurityDirect.FirstOrDefault(x => x.TableDrivedEntityID == targetEntity.ID && x.Mode == (short)DataDirectSecurityMode.FetchData);
                    //}
                    return(null);
                }


                //   entityState = bizEntityState.ToEntityStateDTO(requester, targetEntityDisrectSecurity.TableDrivedEntityState, true);
                foreach (var condition in targetEntityDisrectSecurity.EntityState.StateConditions.ToList())
                {
                    if (ConditionSecuritySubjectIsValid(requester, condition))
                    {
                        GetConditionDTOWithValues(requester, condition);
                    }
                    else
                    {
                        targetEntityDisrectSecurity.EntityState.StateConditions.Remove(condition);
                    }
                }

                return(targetEntityDisrectSecurity.EntityState);
                //var organizationPosts = GetDBOrganizationPosts(context, requester);
                //BizOrganization bizOrganization = new BizOrganization();
                //foreach (var post in organizationPosts)
                //{
                //    //  List<EntitySecurityDirectDTO> listDirectSecuritiesForPost = new List<EntitySecurityDirectDTO>();
                //    var postDto = requester.Posts.FirstOrDefault(x => x.ID == post.ID);
                //    if (postDto == null)
                //        postDto = bizOrganization.GetOrganizationPost(post.ID);
                //    var postDisrectSecurities = GetDirectSecurities(requester, postDto, targetEntityDisrectSecurities, directSecurityEntityID);
                //postDisrectSecurities.AddRange(GetDirectSecurities(requester, disrectSecurities, directSecurityEntityID, post.Organization.SecuritySubject.ID));
                //postDisrectSecurities.AddRange(GetDirectSecurities(requester, disrectSecurities, directSecurityEntityID, post.OrganizationType_RoleType.SecuritySubject.ID));
                //postDisrectSecurities.AddRange(GetDirectSecurities(requester, disrectSecurities, directSecurityEntityID, post.OrganizationType_RoleType.OrganizationType.SecuritySubject.ID));
                //postDisrectSecurities.AddRange(GetDirectSecurities(requester, disrectSecurities, directSecurityEntityID, post.OrganizationType_RoleType.RoleType.SecuritySubject.ID));


                //منطق اینجا رو نفهمیدم غیر فعال شد. بجاش بالا همه دسترسی ها تجمیع می شوند
                //////if (postDisrectSecurities.Any())
                //////    listDirectSecuritiesForPost.AddRange(postDisrectSecurities);
                //////else
                //////{
                //////    var orgTypeRoleTypeDisrectSecurities = GetDirectSecurities(requester, disrectSecurities, directSecurityEntityID, post.OrganizationType_RoleType.SecuritySubject.ID);
                //////    var organizationDisrectSecurities = GetDirectSecurities(requester, disrectSecurities, directSecurityEntityID, post.Organization.SecuritySubject.ID);
                //////    if (orgTypeRoleTypeDisrectSecurities.Any())
                //////    {
                //////        //اینجا دسترسی های موازی با هم جمع میشوند زیرا معلوم نیست بروی کدام آبجکت دارند اعمال میشوند و تصمیم گیری در مورد تداخل دسترسی بروی یک آبجکت به کلاینت واگذار میشود
                //////        listDirectSecuritiesForPost.AddRange(orgTypeRoleTypeDisrectSecurities);
                //////        listDirectSecuritiesForPost.AddRange(organizationDisrectSecurities);
                //////    }
                //////    else
                //////    {
                //////        var roleTypeDisrectSecurities = GetDirectSecurities(requester, disrectSecurities, directSecurityEntityID, post.OrganizationType_RoleType.RoleType.SecuritySubject.ID);
                //////        if (organizationDisrectSecurities.Any())
                //////        {
                //////            listDirectSecuritiesForPost.AddRange(organizationDisrectSecurities);
                //////            listDirectSecuritiesForPost.AddRange(roleTypeDisrectSecurities);
                //////        }
                //////        else
                //////        {
                //////            var organizationTypeDisrectSecurities = GetDirectSecurities(requester, disrectSecurities, directSecurityEntityID, post.OrganizationType_RoleType.OrganizationType.SecuritySubject.ID);
                //////            listDirectSecuritiesForPost.AddRange(organizationTypeDisrectSecurities);
                //////            listDirectSecuritiesForPost.AddRange(roleTypeDisrectSecurities);
                //////        }
                //////    }
                //////}



                //if (listDirectSecuritiesForPost.Any())
                //{
                //اونهای که سابجکت نال دارند و عمومی هستند
                //var generalSecurityItems = GetGeneralEntitySecurityItems(requester, directSecurityEntityID);
                //if (generalSecurityItems.Any())
                //    postDisrectSecurities.AddRange(generalSecurityItems);
                //foreach (var generalSecurityItem in generalSecurityItems)
                //{
                //    foreach (var directSecurityItem in listDirectSecuritiesForPost)
                //    {
                //        directSecurityItem.Conditions.AddRange(generalSecurityItem.Conditions);
                //    }
                //}
                //}
                //listDirectSecuritiesForPost.AddRange(generalSecurityItems);
                //    allPostsDirectSecurities.Add(new PostEntityDataSecurityItems(postDto, postDisrectSecurities));
                //}
            }
            //CacheManager.GetCacheManager().AddCacheItem(result, CacheItemType.ConditionalPermission, securitySubjectID.ToString(), entityID.ToString());
            //   return new EntityDataSecurityItems(entityState, indisrectSecurityDTO, entityStateConditions);
        }