我正在使用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);
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 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);
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,但它是只读的…我错过了什么?
结论:
好的,所以我可以一次处理一个批次的项目,也可以将每个批次中的每个项目添加到一个列表中,稍后再处理它们,就像我目前所做的那样。
它们之间没有太多关系;我刚开始使用列表,但我会进一步考虑选择。