public IForumPost SelectPost(Guid forumPostId)
        {
            var serviceContext = Dependencies.GetServiceContext();

            var postFetch = new Fetch
            {
                Entity = new FetchEntity("adx_communityforumpost")
                {
                    Filters = new[]
                    {
                        new Filter
                        {
                            Conditions = new[] {
                                new Condition("adx_communityforumpostid", ConditionOperator.Equal, forumPostId),
                                new Condition("adx_forumthreadid", ConditionOperator.Equal, this.ForumThread.Id)
                            }
                        }
                    }
                }
            };
            var entity = serviceContext.RetrieveSingle(postFetch);

            if (entity == null)
            {
                return(null);
            }

            var website          = Dependencies.GetWebsite();
            var securityProvider = Dependencies.GetSecurityProvider();
            var urlProvider      = Dependencies.GetUrlProvider();
            var viewEntity       = new PortalViewEntity(serviceContext, entity, securityProvider, urlProvider);

            var cloudStorageAccount                  = AnnotationDataAdapter.GetStorageAccount(serviceContext);
            var cloudStorageContainerName            = AnnotationDataAdapter.GetStorageContainerName(serviceContext);
            CloudBlobContainer cloudStorageContainer = null;

            if (cloudStorageAccount != null)
            {
                cloudStorageContainer = AnnotationDataAdapter.GetBlobContainer(cloudStorageAccount, cloudStorageContainerName);
            }

            var postInfo = serviceContext.FetchForumPostInfo(entity.Id, website.Id, cloudStorageContainer);
            var user     = Dependencies.GetPortalUser();

            return(new ForumPost(entity, viewEntity, postInfo,
                                 new Lazy <ApplicationPath>(() => Dependencies.GetEditPath(entity.ToEntityReference()), LazyThreadSafetyMode.None),
                                 new Lazy <ApplicationPath>(() => Dependencies.GetDeletePath(entity.ToEntityReference()), LazyThreadSafetyMode.None),
                                 canEdit: new Lazy <bool>(() =>
                                                          user != null &&
                                                          user.Equals(postInfo.Author.EntityReference), LazyThreadSafetyMode.None)));
        }
        public IEnumerable <IForumPost> SelectPosts(bool descending, int startRowIndex, int maximumRows = -1)
        {
            ADXTrace.Instance.TraceInfo(TraceCategory.Application, string.Format("startRowIndex={0}, maximumRows={1}: Start", startRowIndex, maximumRows));

            if (startRowIndex < 0)
            {
                throw new ArgumentException("Value must be a positive integer.", "startRowIndex");
            }

            if (maximumRows == 0)
            {
                return(new IForumPost[] { });
            }

            var serviceContext   = Dependencies.GetServiceContext();
            var securityProvider = Dependencies.GetSecurityProvider();

            var query = serviceContext.CreateQuery("adx_communityforumpost")
                        .Where(e => e.GetAttributeValue <EntityReference>("adx_forumthreadid") == ForumThread);

            query = descending
                                ? query.OrderByDescending(e => e.GetAttributeValue <DateTime?>("adx_date"))
                                : query.OrderBy(e => e.GetAttributeValue <DateTime?>("adx_date"));

            if (startRowIndex > 0)
            {
                query = query.Skip(startRowIndex);
            }

            if (maximumRows > 0)
            {
                query = query.Take(maximumRows);
            }

            var website         = Dependencies.GetWebsite();
            var entities        = query.ToArray();
            var firstPostEntity = entities.FirstOrDefault();

            var cloudStorageAccount                  = AnnotationDataAdapter.GetStorageAccount(serviceContext);
            var cloudStorageContainerName            = AnnotationDataAdapter.GetStorageContainerName(serviceContext);
            CloudBlobContainer cloudStorageContainer = null;

            if (cloudStorageAccount != null)
            {
                cloudStorageContainer = AnnotationDataAdapter.GetBlobContainer(cloudStorageAccount, cloudStorageContainerName);
            }

            var postInfos   = serviceContext.FetchForumPostInfos(entities.Select(e => e.Id), website.Id, cloudStorageContainer: cloudStorageContainer);
            var urlProvider = Dependencies.GetUrlProvider();
            var thread      = Select();
            var user        = Dependencies.GetPortalUser();

            var posts = entities.Select(entity =>
            {
                IForumPostInfo postInfo;
                postInfo       = postInfos.TryGetValue(entity.Id, out postInfo) ? postInfo : new UnknownForumPostInfo();
                var viewEntity = new PortalViewEntity(serviceContext, entity, securityProvider, urlProvider);

                return(new ForumPost(entity, viewEntity, postInfo,
                                     new Lazy <ApplicationPath>(() => Dependencies.GetEditPath(entity.ToEntityReference()), LazyThreadSafetyMode.None),
                                     new Lazy <ApplicationPath>(() => Dependencies.GetDeletePath(entity.ToEntityReference()), LazyThreadSafetyMode.None),
                                     new Lazy <bool>(() => thread.Editable, LazyThreadSafetyMode.None),
                                     new Lazy <bool>(() =>
                                                     thread.ThreadType != null &&
                                                     thread.ThreadType.RequiresAnswer &&
                                                     (firstPostEntity == null || !firstPostEntity.ToEntityReference().Equals(entity.ToEntityReference())) &&
                                                     ((user != null && user.Equals(thread.Author.EntityReference)) || thread.Editable) &&
                                                     !thread.Locked,
                                                     LazyThreadSafetyMode.None),
                                     canEdit: new Lazy <bool>(() =>
                                                              user != null &&
                                                              user.Equals(postInfo.Author.EntityReference) &&
                                                              !thread.Locked, LazyThreadSafetyMode.None)));
            }).ToArray();

            ADXTrace.Instance.TraceInfo(TraceCategory.Application, "End");

            return(posts);
        }