Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/redis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Exchange Web服务:使用FindItemsResult批处理<;项目>;_C#_Exchangewebservices_Ews Managed Api - Fatal编程技术网

C# Exchange Web服务:使用FindItemsResult批处理<;项目>;

C# Exchange Web服务:使用FindItemsResult批处理<;项目>;,c#,exchangewebservices,ews-managed-api,C#,Exchangewebservices,Ews Managed Api,我正在使用Exchange Web服务编写一个处理电子邮件附件的应用程序 我的问题领域的总体结构如下: public static void Main() { FindItemsResults<Item> findResults = FindItems(); foreach (Item item in findResults) { DoSomethingWithItem(item); } } public static FindIt

我正在使用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;
}
这会循环发送我想要发送的所有电子邮件,但由于我还不明白的原因,foreach循环现在只处理findResults中的第一项

即使findResults包含多个项(
findResults.Items.Count
>1),在我的第二个示例中,
findResults.MoreAvailable
=false。公平地说,我已经循环了前面的批次,所以我看最后一批的末尾是有意义的

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

结论:

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


他们之间没有太多的分歧;我最初开始使用一个列表,但我会考虑进一步的选择。

在我看来,您的主要问题是,您尝试定义一个函数,它返回<代码> FIDITEMsRESULTS/<代码>。如果使用结果配对,则不会有一个此类对象。而不是在检索每个新页面时,
FindItemsResults
将被覆盖。以下示例显示
收件箱中所有项目的主题:

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);
ItemView视图=新的ItemView(10,0,OffsetBasePoint.start);
view.OrderBy.Add(ItemSchema.DateTimeReceived,SortDirection.Descending);
view.PropertySet=新属性集(
BasePropertySet.i仅限,
ItemSchema.Subject,
ItemSchema.DateTimeReceived);
//保存文件夹,我们将在其中搜索一次
Folder myInbox=Folder.Bind(服务,WellKnownFolderName.Inbox);
FindItemsResults findResults;
做
{
findResults=myInbox.FindItems(
新的SearchFilter.ContainsSubstring(ItemSchema.Subject,
Properties.Settings.Default.EmailSubject),
视图);
foreach(findResults中的项目)
{
//用这个东西做点什么。
Console.WriteLine();
如果(项目为EmailMessage)
{
EmailMessage em=作为EmailMessage的项目;
Console.WriteLine(“Subject:\“{0}\”,em.Subject);
}
否则,如果(项目为会议请求)
{
MeetingRequest mr=作为MeetingRequest的项目;
Console.WriteLine(“主题:\{0}\”,主题先生);
}
其他的
{
//我们可以处理其他项目类型
}
}
//还有批次吗?
if(findResults.NextPageOffset.HasValue)
{
view.Offset=findResults.NextPageOffset.Value;
}
}
而(findResults.MoreAvailable);
代码在控制台输出上显示主题。如果要以另一种方式使用
电子邮件
会议请求
,则应修改相应的代码。您还可以定义一个代理,该代理处理找到的
电子邮件
会议请求
,并在
控制台上调用该代理。WriteLine
。如果确实需要在某个位置对所有项目进行相同的操作,则必须创建一些集合,如
列表
,在函数中填充并返回,而不是当前执行的
FindItemsResults

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