EWS pobiera liczbę nieprzeczytanych wiadomości e-mail ze wszystkich folderów

Próbuję uzyskać liczbę nieprzeczytanych wiadomości e-mail od Exchange dla konkretnego użytkownika.

Jestem w stanie uzyskać taką liczbę e-maili z Inbox:

SearchFilter sf = new SearchFilter.SearchFilterCollection(LogicalOperator.And, new SearchFilter.IsEqualTo(EmailMessageSchema.IsRead, false));
ItemView view = new ItemView(int.MaxValue);
FindItemsResults<Item> findResults = service.FindItems(WellKnownFolderName.Inbox, sf, view);
int unreadCount = 0;
foreach (EmailMessage i in findResults)
    {
        unreadCount++;
    }
label1.Text = unreadCount.ToString();

To działa świetnie.
Jestem także w stanie uzyskać wszystkie podfoldery: Skrzynka odbiorcza:

FindFoldersResults findResults1 = service.FindFolders(
    WellKnownFolderName.Inbox,
    new FolderView(int.MaxValue) { Traversal = FolderTraversal.Deep });

foreach (Folder folder in findResults1.Folders)
{
    Console.WriteLine(folder.DisplayName);
}

Problem polega na tym, że nie jestem w stanie połączyć tych dwóch razem.
Wiem, że mogę wykonać zagnieżdżoną pętlę foreach, ale chciałbym tego uniknąć.

Znalazłem te pytania:Exchange Web Services (EWS) FindItems we wszystkich folderach, ale wymaga przynajmniej użycia programu Outlook 2010 w celu utworzeniaAllItems teczka.

Wiem, że mogę stworzyćSearchFilterCollection, ale jak dodać do niego reguły, aby wyszukiwał nieprzeczytane wiadomości e-mail w skrzynce odbiorczej i wszystkich podfolderach?

EDYTOWAĆ:

To właśnie próbowałem zrobić do tej pory:

private int getEmailCount()
{
    int unreadCount = 0;

    FolderView viewFolders = new FolderView(int.MaxValue) { Traversal = FolderTraversal.Deep, PropertySet = new PropertySet(BasePropertySet.IdOnly) };
    ItemView viewEmails = new ItemView(int.MaxValue) { PropertySet = new PropertySet(BasePropertySet.IdOnly) };
    SearchFilter unreadFilter = new SearchFilter.SearchFilterCollection(LogicalOperator.And, new SearchFilter.IsEqualTo(EmailMessageSchema.IsRead, false));

    FindItemsResults<Item> findResults = service.FindItems(WellKnownFolderName.Inbox, unreadFilter, viewEmails);
    unreadCount += findResults.Count();

    FindFoldersResults inboxFolders = service.FindFolders(WellKnownFolderName.Inbox, viewFolders);

    foreach (Folder folder in inboxFolders.Folders)
    {
        findResults = service.FindItems(folder.Id, unreadFilter, viewEmails);
        unreadCount += findResults.Count();
    }

    return unreadCount;
    }

Zasadniczo to działa, ale kiedy utworzyłem wiele podfolderów, zaczął działać bardzo wolno.
Czy zamiast wielu zapytań mogę uzyskać takie same wyniki?

questionAnswers(4)

yourAnswerToTheQuestion