public ResultSet <List <IContactSearchResult> > Find(ContactSearchParameters parameters) { var resultSet = new ResultSet <List <IContactSearchResult> >(parameters.PageNumber, parameters.PageSize); var ctx = ContentSearchManager.GetIndex(CustomerIntelligenceConfig.ContactSearch.SearchIndexName).CreateSearchContext(); try { var searchResults = QueryIndex(ctx, parameters); var list1 = searchResults.Hits.Select(h => h.Document).ToList(); resultSet.TotalResultCount = searchResults.TotalSearchResults; var list2 = list1.Select(sr => { var contact = BuildBaseResult(sr); var visit = ctx.GetQueryable <IndexedVisit>().Where(iv => iv.ContactId == contact.ContactId).OrderByDescending(iv => iv.StartDateTime).Take(1).FirstOrDefault(); if (visit != null) { PopulateLatestVisit(visit, ref contact); } return(contact); }).OrderBy(c => c.FirstName).ThenBy(c => c.LatestVisitStartDateTime).ToList(); resultSet.Data.Dataset.Add("ContactSearchResults", list2); } finally { if (ctx != null) { ctx.Dispose(); } } return(resultSet); }
public IEnumerable <ContactSearchResult> SearchContacts([FromBody] ContactSearchParameters searchParms) { TokenManager tm = new TokenManager(); int currentUserId = int.Parse(tm.Payload(Constants.Token_UserId)); ContactsManager cm = new ContactsManager(); return(cm.SearchContacts(currentUserId, searchParms)); }
/// <summary> /// Returns a list of contacts that meet the specified search criteria. /// </summary> /// <param name="userId"></param> /// <param name="searchParms"></param> /// <returns></returns> public IEnumerable <ContactSearchResult> SearchContacts(int userId, ContactSearchParameters searchParms) { List <ContactSearchResult> results = new List <ContactSearchResult>(); // A malformed JSON string can result in a null searchParms argument if (searchParms == null) { return(results); } // Get out quick if called with no parms. Is there any need to call this with no parms? if (string.IsNullOrEmpty(searchParms.FirstName) && string.IsNullOrEmpty(searchParms.LastName) && string.IsNullOrEmpty(searchParms.PrimaryEmail)) { return(results); } // Change any null values to empty strings to make the query more forgiving if (searchParms.FirstName == null) { searchParms.FirstName = string.Empty; } if (searchParms.LastName == null) { searchParms.LastName = string.Empty; } if (searchParms.PrimaryEmail == null) { searchParms.PrimaryEmail = string.Empty; } using (var db = new CSET_Context()) { var email = db.USERS.Where(x => x.UserId == userId).FirstOrDefault(); if (email == null) { return(results); } // create a list of user emails already attached to the assessment var attachedEmails = db.ASSESSMENT_CONTACTS.Where(x => x.Assessment_Id == searchParms.AssessmentId).ToList().Select(x => x.PrimaryEmail); var query = from ac in db.ASSESSMENT_CONTACTS join a in db.ASSESSMENTS on ac.Assessment_Id equals a.Assessment_Id join myac in db.ASSESSMENT_CONTACTS on a.Assessment_Id equals myac.Assessment_Id where ac.FirstName.Contains(searchParms.FirstName) && ac.LastName.Contains(searchParms.LastName) && ac.PrimaryEmail.Contains(searchParms.PrimaryEmail) && myac.PrimaryEmail == email.PrimaryEmail // don't include anyone already attached to the current assessment && !attachedEmails.Contains(ac.PrimaryEmail) select new { ac.UserId, ac.FirstName, ac.LastName, ac.PrimaryEmail }; // Generate a distinct, case-insensitive result list var candidates = query.ToList(); var filteredCandidates = query.ToList(); filteredCandidates.Clear(); foreach (var candidate in candidates) { if (!filteredCandidates.Exists(x => String.Equals(x.FirstName, candidate.FirstName, StringComparison.InvariantCultureIgnoreCase) && String.Equals(x.LastName, candidate.LastName, StringComparison.InvariantCultureIgnoreCase) && String.Equals(x.PrimaryEmail, candidate.PrimaryEmail, StringComparison.InvariantCultureIgnoreCase))) { filteredCandidates.Add(candidate); ContactSearchResult r = new ContactSearchResult { UserId = (int)candidate.UserId, FirstName = candidate.FirstName, LastName = candidate.LastName, PrimaryEmail = candidate.PrimaryEmail }; results.Add(r); } } return(results); } }
private SearchResults <IndexedContact> QueryIndex(IProviderSearchContext ctx, ContactSearchParameters parameters) { var queryable = ctx.GetQueryable <IndexedContact>(); var text = parameters.Match; if (string.IsNullOrEmpty(text.Trim()) || text == "*") { return(queryable.Page(parameters.PageNumber - 1, parameters.PageSize).GetResults()); } var wildcard = "*" + text + "*"; var slop = 10; var source = queryable.Where(q => q.FullName.MatchWildcard(wildcard) || q.Emails.MatchWildcard(wildcard) || q["contact.company"].MatchWildcard(wildcard)); if (!source.Any()) { source = queryable.Where(q => q.FullName.Like(text, slop) || q.Emails.Like(text, slop) || q["contact.company"].Like(text, slop)); } return(source.Page(parameters.PageNumber - 1, parameters.PageSize).GetResults()); }