代码之家  ›  专栏  ›  技术社区  ›  CJM

Exchange Web服务:使用finditemsResult批处理<item>

  •  3
  • CJM  · 技术社区  · 14 年前

    我正在使用Exchange Web服务编写一个应用程序来处理电子邮件附件。

    我的问题领域的总体结构如下:

    public static void Main()
    {
        FindItemsResults<Item> findResults = FindItems();
    
        foreach (Item item in findResults)
        {
            DoSomethingWithItem(item);
        }
    }
    
    public static FindItemsResults<Item> FindItems()
    {
                FindItemsResults<Item> findResults;
    
                ItemView view = new ItemView(10);    //batching 10 at a time
                view.OrderBy.Add(ItemSchema.DateTimeReceived, SortDirection.Ascending);
                view.PropertySet = new PropertySet(
                    BasePropertySet.IdOnly,
                    ItemSchema.Subject,
                    ItemSchema.DateTimeReceived);
    
                findResults = service.FindItems(
                    WellKnownFolderName.Inbox,
                    new SearchFilter.SearchFilterCollection(
                        LogicalOperator.Or,
                        new SearchFilter.ContainsSubstring(ItemSchema.Subject, Properties.Settings.Default.EmailSubject)),
                    view);
    
                //return set of emails
                return findResults;
    }
    

    起初,这看起来还可以——它完美地处理了我之前的测试示例。但是当我开始批量测试时,我意识到它只处理前10个项目,因为我指定了10个项目的批量大小。( ItemView view = new ItemView(10 )但是我没有检查更多的批次。

    我本可以简单地增加批量大小,但是一个快速的谷歌之后,我发现了一个更好的例子:

    public static FindItemsResults<Item> FindItems()
    {
                FindItemsResults<Item> findResults;
    
                ItemView view = new ItemView(10, 0, OffsetBasePoint.Beginning); 
                view.OrderBy.Add(ItemSchema.DateTimeReceived, SortDirection.Ascending);
                view.PropertySet = new PropertySet(
                    BasePropertySet.IdOnly,
                    ItemSchema.Subject,
                    ItemSchema.DateTimeReceived);
    
                do
                {
                    findResults = service.FindItems(
                        WellKnownFolderName.Inbox,
                        new SearchFilter.SearchFilterCollection(
                            LogicalOperator.Or,
                            new SearchFilter.ContainsSubstring(ItemSchema.Subject, Properties.Settings.Default.EmailSubject)),
                        view);
    
                    //any more batches?
                    if (findResults.NextPageOffset.HasValue)
                    {
                        view.Offset = findResults.NextPageOffset.Value;
                    }
                }
                while (findResults.MoreAvailable);
    
                return findResults;
    }
    

    这个循环通过尽可能多的电子邮件,但由于我还不能理解的原因,foreach循环现在只处理findresults中的第一个项目。

    即使findresults包含多个项( findResults.Items.Count >1),用我的第二个例子, findResults.MoreAvailable =假。公平地说,我之前已经循环过这些批次,所以我查看最后一批的末尾是有意义的。

    但我如何重置findresults以便它处理整个批次?我尝试设置findresults.moreavailable,但它是只读的…我错过了什么?

    结论:

    好的,所以我可以一次处理一个批次的项目,也可以将每个批次中的每个项目添加到一个列表中,稍后再处理它们,就像我目前所做的那样。

    它们之间没有太多关系;我刚开始使用列表,但我会进一步考虑选择。

    1 回复  |  直到 10 年前
        1
  •  8
  •   Oleg    14 年前

    FindItemsResults<Item> Inbox

    ItemView view = new ItemView(10, 0, OffsetBasePoint.Beginning);
    view.OrderBy.Add(ItemSchema.DateTimeReceived, SortDirection.Descending);
    view.PropertySet = new PropertySet(
        BasePropertySet.IdOnly,
        ItemSchema.Subject,
        ItemSchema.DateTimeReceived);
    
    // save the folder where we will make searching to do this one time
    Folder myInbox = Folder.Bind(service, WellKnownFolderName.Inbox);
    
    FindItemsResults<Item> findResults;
    
    do
    {
        findResults = myInbox.FindItems(
            new SearchFilter.ContainsSubstring(ItemSchema.Subject,
                    Properties.Settings.Default.EmailSubject)),
            view);
    
        foreach (Item item in findResults)
        {
            // Do something with the item.
            Console.WriteLine();
            if (item is EmailMessage)
            {
                EmailMessage em = item as EmailMessage;
                Console.WriteLine("Subject: \"{0}\"", em.Subject);
            }
            else if (item is MeetingRequest)
            {
                MeetingRequest mr = item as MeetingRequest;
                Console.WriteLine("Subject: \"{0}\"", mr.Subject);
            }
            else
            {
                // we can handle other item types
            }
        }
    
        //any more batches?
        if (findResults.NextPageOffset.HasValue)
        {
            view.Offset = findResults.NextPageOffset.Value;
        }
    }
    while (findResults.MoreAvailable);
    

    EmailMessage MeetingRequest Console.WriteLine List<Item>