EWS obtenir nombre de courriels non lus de tous les dossiers

Je vais essayer d'obtenir le nombre d'e-mails non lus à partir d'Exchange pour un utilisateur spécifique.

Je suis en mesure d'obtenir le nombre d'e-mails à partir de la Boîte de réception comme suit:

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();

Cela fonctionne très bien.

Je suis également en mesure d'obtenir tous les sous-dossiers de la Boîte de réception:

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

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

Problème est que je ne suis pas capable de combiner ces deux ensemble.

Je sais que je peux faire imbriquée boucle foreach, mais je voudrais l'éviter.

J'ai trouvé ces question: Exchange Web Services (EWS) FindItems dans Tous les Dossiers, mais il nécessite d'au moins utiliser Outlook 2010 dans le but de créer AllItems dossier.

Je sais que je peux créer SearchFilterCollection, mais comment faire pour ajouter des règles pour qu'il sera à la recherche d'e-mails non lus dans la Boîte de réception et tous les sous-dossiers?

EDIT:

Ce que j'ai essayé de faire jusqu'à présent:

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;
    }

En gros, cela fonctionne, mais lorsque j'ai créé plusieurs sous-dossiers qu'il a commencé à travailler très lent.

Au lieu de plusieurs requêtes puis-je faire un pour obtenir les mêmes résultats?

OriginalL'auteur Misiu | 2012-10-02