private IList <Resource> GetRelatedItems <TResource>(TResource resource, Guid userId) where TResource : Resource { // Display up to 3 of the current type and 1 of each other. // If there are insufficient of any type make up numbers with articles. // Fetch one more than the required number in case the current item is fetched var articles = _resourcesQuery.GetRelatedArticles(resource.SubcategoryId, userId, RelatedItemsCount + 1); var videos = _resourcesQuery.GetRelatedVideos(resource.SubcategoryId, userId, RelatedItemsCount + 1); var qnas = _resourcesQuery.GetRelatedQnAs(resource.SubcategoryId, userId, RelatedItemsCount + 1); var relatedItems = new List <Resource>(); if (resource is QnA) { relatedItems = relatedItems.Concat(from q in qnas where q.Id != resource.Id select q).Take(3).ToList(); relatedItems = relatedItems.Concat(videos.Take(1)).ToList(); relatedItems = relatedItems.Concat(articles.Take(RelatedItemsCount - relatedItems.Count)).ToList(); } else if (resource is Video) { relatedItems = relatedItems.Concat(from v in videos where v.Id != resource.Id select v).Take(3).ToList(); relatedItems = relatedItems.Concat(qnas.Take(1)).ToList(); relatedItems = relatedItems.Concat(articles.Take(RelatedItemsCount - relatedItems.Count)).ToList(); } else if (resource is Article) { var relatedQnas = qnas.Take(1).ToList(); var relatedVideos = videos.Take(1).ToList(); var articlesCount = RelatedItemsCount - relatedQnas.Count - relatedVideos.Count; relatedItems = relatedItems.Concat(from a in articles where a.Id != resource.Id select a).Take(articlesCount).Concat(relatedQnas).Concat(relatedVideos).ToList(); } return(relatedItems); }