public IEnumerable <EntityCollection> GetRelatedProductsAndArticles(IKnowledgeArticle article)
        {
            var   serviceContext       = this.Dependencies.GetServiceContext();
            Fetch fetchRelatedProducts = null;
            Fetch fetchRelatedArticles = null;

            var articleConnectionRole        = GetArticleConnectionRole(serviceContext, this.KnowledgeArticleConnectionRoleId);
            var relatedProductConnectionRole = GetArticleConnectionRole(serviceContext, this.RelatedProductConnectionRoleId);

            if (articleConnectionRole != null && relatedProductConnectionRole != null)
            {
                var relatedProductsFetchXml = string.Format(RelatedProductsFetchXmlFormat,
                                                            article.Id,
                                                            relatedProductConnectionRole.Id,
                                                            articleConnectionRole.Id);

                fetchRelatedProducts = Fetch.Parse(relatedProductsFetchXml);
            }

            var languageCondition = string.Empty;

            if (!string.IsNullOrWhiteSpace(this.LanguageCode))
            {
                languageCondition = "<condition entityname='language_locale' attribute='code' operator='eq' value = '" + this.LanguageCode + "' />";
            }

            var primaryArticleConnectionRole = GetArticleConnectionRole(serviceContext, this.PrimaryArticleConnectionRoleId);
            var relatedArticleConnectionRole = GetArticleConnectionRole(serviceContext, this.RelatedArticleConnectionRoleId);

            if (primaryArticleConnectionRole != null && relatedArticleConnectionRole != null)
            {
                var id = article.RootArticle == null ? article.Id : article.RootArticle.Id;
                var relatedArticlesFetchXml = string.Format(RelatedArticlesFetchXmlFormat,
                                                            id,
                                                            primaryArticleConnectionRole.Id,
                                                            relatedArticleConnectionRole.Id,
                                                            languageCondition);

                fetchRelatedArticles = Fetch.Parse(relatedArticlesFetchXml);
            }

            var products = new EntityCollection();

            if (fetchRelatedProducts != null)
            {
                products = serviceContext.RetrieveMultiple(fetchRelatedProducts, RequestFlag.AllowStaleData);
            }

            var articles = new EntityCollection();

            if (fetchRelatedArticles != null)
            {
                articles = serviceContext.RetrieveMultiple(fetchRelatedArticles, RequestFlag.AllowStaleData);
            }

            return(new List <EntityCollection> {
                products, articles
            }.AsEnumerable());
        }
        public KnowledgeArticleDrop(IPortalLiquidContext portalLiquidContext, IDataAdapterDependencies dependencies, IKnowledgeArticle article)
            : base(portalLiquidContext, article.Entity)
        {
            if (dependencies == null)
            {
                throw new ArgumentNullException("dependencies");
            }
            if (article == null)
            {
                throw new ArgumentNullException("article");
            }

            Article = article;
        }
        public virtual IEnumerable <IRelatedNote> SelectRelatedNotes(IKnowledgeArticle article)
        {
            if (!IsAnnotationSearchEnabled)
            {
                return(null);
            }

            var annotationDataAdapter = new AnnotationDataAdapter(this.Dependencies);
            var webPrefix             = GetNotesFilterPrefix;

            var relatedNotes = annotationDataAdapter.GetDocuments(article.EntityReference, webPrefix: webPrefix);

            return(relatedNotes.Select(a => new RelatedNote(a.NoteText == null ? string.Empty : a.NoteText.ToString().Substring(webPrefix.Length), a.FileAttachment.FileName, a.FileAttachment.Url)));
        }