public List <MailMessageData> GetConversations(MailSearchFilterData filterData, out bool hasMore) { if (filterData == null) { throw new ArgumentNullException("filterData"); } var filter = (MailSearchFilterData)filterData.Clone(); if (filter.UserFolderId.HasValue && Factory.UserFolderEngine.Get((uint)filter.UserFolderId.Value) == null) { throw new ArgumentException("Folder not found"); } using (var daoFactory = new DaoFactory()) { var filteredConversations = GetFilteredConversations(daoFactory, filter, out hasMore); if (!filteredConversations.Any()) { return(filteredConversations); } var chainIds = new List <string>(); filteredConversations.ForEach(x => chainIds.Add(x.ChainId)); var daoChain = daoFactory.CreateChainDao(Tenant, User); var exp = SimpleConversationsExp.CreateBuilder(Tenant, User) .SetChainIds(chainIds) .SetFoldersIds( filter.PrimaryFolder == FolderType.Inbox || filter.PrimaryFolder == FolderType.Sent ? new List <int> { (int)FolderType.Inbox, (int)FolderType.Sent } : new List <int> { (int)filter.PrimaryFolder }) .Build(); var extendedInfo = daoChain.GetChains(exp); foreach (var chain in filteredConversations) { var chainMessages = extendedInfo.FindAll(x => x.MailboxId == chain.MailboxId && x.Id == chain.ChainId); if (!chainMessages.Any()) { continue; } chain.IsNew = chainMessages.Any(x => x.Unread); chain.HasAttachments = chainMessages.Any(x => x.HasAttachments); chain.Important = chainMessages.Any(x => x.Importance); chain.ChainLength = chainMessages.Sum(x => x.Length); var firstOrDefault = chainMessages.FirstOrDefault(x => !string.IsNullOrEmpty(x.Tags)); chain.LabelsString = firstOrDefault != null ? firstOrDefault.Tags : ""; } return(filteredConversations); } }