2010-09-30 65 views
3

我正在編寫一個應用程序來使用Exchange Web服務處理電子郵件附件。Exchange Web服務:使用FindItemsResult進行批處理<Item>

我的問題區域的一般結構如下:

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 = false。很公平,我早些時候通過了批次,所以我看到最後一批的結束是有道理的。

但是,如何重置findResults,以便處理整個過程?我嘗試設置findResults.MoreAvailable,但它是隻讀的...我錯過了什麼?

結論:

好了,我可以處理項目一個批次的時間,或者我可以在每個批次添加的每個項目列表,以後再處理它們,因爲我目前做的。

他們之間沒有太多的關係;我最初開始使用List,但我會進一步考慮選擇。

回答

8

在我看來,你的主要問題是你試着定義一個返回FindItemsResults<Item>的函數。如果您使用結果配對,您將有而不是一個這種類型的對象。而不是檢索每個新頁面,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); 

的代碼顯示在控制檯輸出對象。如果您想以另一種方式使用EmailMessageMeetingRequest,則應該修改代碼記者。您也可以定義一個委託人,對發現的EmailMessageMeetingRequest做一些事情,然後致電Console.WriteLine處的代表。如果你確實需要把所有的東西都放在同一個地方,那麼你將不得不創建一些像List<Item>這樣的集合,在那裏填充函數並返回,而不是你目前做的FindItemsResults<Item>

相關問題