public override async Task <List <Article> > GetArticles(Dictionary <string, string> query, string authedUsername = null) { List <int> articleIds = _articleRepository.GetAllArticleIds(); if (null != query.GetValueOrDefault("tag")) { Int32 tagId = _tagsRepository.GetTagId(query.GetValueOrDefault("tag")); articleIds = articleIds.Intersect(_articleTagsRepository.GetArticlesWithTag(tagId)).ToList(); } if (null != query.GetValueOrDefault("author")) { IdentityUser author = await _userManager.FindByNameAsync(query.GetValueOrDefault("author")); articleIds = articleIds.Intersect(_articleRepository.GetArticlesByAuthorId(author?.Id).Select(e => e.Id).ToList()).ToList(); } if (null != query.GetValueOrDefault("favorited")) { IdentityUser favoritedUser = await _userManager.FindByNameAsync(query.GetValueOrDefault("favorited")); articleIds = articleIds.Intersect(_favoriteArticleRepository.GetFavoriteArticlesForUser(favoritedUser?.Id)).ToList(); } List <ArticleDAO> articleDaos = _articleRepository.GetArticlesByArticleIds(articleIds); if (null != query.GetValueOrDefault("offset")) { articleDaos = (List <ArticleDAO>)articleDaos.Skip(Convert.ToInt32(query.GetValueOrDefault("offset"))); } if (null != query.GetValueOrDefault("limit")) { articleDaos = (List <ArticleDAO>)articleDaos.Take(Convert.ToInt32(query.GetValueOrDefault("limit"))); } List <Article> articles = new List <Article>(); foreach (ArticleDAO articleDao in articleDaos) { articles.Add(await CreateArticleFromDAO(articleDao, authedUsername)); } return(articles); }