public JsonResult TagSearch(int[] data) { // Last element of data contains configuration instead of tags, tread carefully! int configuration = data[data.Length - 1]; int[] tags = new int[data.Length - 1]; Array.Copy(data, tags, data.Length - 1); if (tags.Length <= 0) { return(null); } TagSearchConfiguration tagSearchConfig = (TagSearchConfiguration)configuration; return(Json(_genericService.GetUserFromTagsAsString(User.Identity.Name, tags, tagSearchConfig, tags.Length))); }
public string GetUserFromTagsAsString(string username, IEnumerable <int> tagIds, TagSearchConfiguration tagSearchConfig, int tagsCount) { var userList = new List <TagSearchResult>(); var uniqueUsers = new Dictionary <int, int>(); using (var unitOfWork = new UnitOfWork()) { var tagMap = unitOfWork.TagRepository.Get(_ => true).ToDictionary(x => x.Id, x => x); var userProfile = unitOfWork.UserProfileRepository.Get(entity => entity.UserName == username).FirstOrDefault(); var requestedUsers = unitOfWork.RequestRepository.Get(entity => entity.From.Id == userProfile.Id).Where(x => x.To != null).Select(x => x.To.Id).ToList(); foreach (var id in tagIds) { Tag tag; if (tagMap.TryGetValue(id, out tag)) { foreach (UserExtendedProfile user in tag.Users) { if (!uniqueUsers.ContainsKey(user.UserProfile.Id) && userProfile.Id != user.UserProfile.Id) { userList.Add(new TagSearchResult(user.UserProfile.Id, user.UserProfile.UserName, user.ImageUrl, requestSent: requestedUsers.Contains(user.UserProfile.Id))); uniqueUsers[user.UserProfile.Id] = 1; } else { if (uniqueUsers.ContainsKey(user.UserProfile.Id)) { uniqueUsers[user.UserProfile.Id]++; } } } } } } if (tagSearchConfig == TagSearchConfiguration.Intersection) { // Intersection return(new JavaScriptSerializer().Serialize(userList.Where(x => uniqueUsers[x.ProfileId] == tagsCount))); } // Union return(new JavaScriptSerializer().Serialize(userList)); }