EWS - 无法执行此操作,因为一个或多个项目是新的或未修改的



关于我之前问过的关于使用单个更新将所有未读电子邮件标记为已读的批量更新问题,我可以根据 Jason 的回答使用ExchangeService.UpdateItems

所以我做了相应的修改:

Folder.Bind(Service, WellKnownFolderName.Inbox);
SearchFilter sf = new SearchFilter.SearchFilterCollection(LogicalOperator.And,
    new SearchFilter.IsEqualTo(EmailMessageSchema.IsRead, false));
//ItemView limits the results to numOfMails2Fetch items
FindItemsResults<Item> foundItems = Service.FindItems(WellKnownFolderName.Inbox, sf,
    new ItemView(numOfMails2Fetch));
if (foundItems.TotalCount > 0)
{
    List<EmailMessage> emailsList = new List<EmailMessage>(foundItems.TotalCount);
    foundItems.Items.ToList().ForEach(item =>
    {
        var iEM = item as EmailMessage;
        // update properties BEFORE ADDING
        iEM.IsRead = true;
        //DO NOT UPDATE INSIDE THE LOOP,I.E. DO NOT USE:
        //iEM.Update(ConflictResolutionMode.AutoResolve);
        //add the EmailMessage to the list
        emailsList.Add(iEM);
    });
    // fetches the body of each email and assigns it to each EmailMessage
    Service.LoadPropertiesForItems(emailsList,PropertySet.FirstClassProperties);
    // Batch update all the emails
    ServiceResponseCollection<UpdateItemResponse> response =
      Service.UpdateItems(emailsList,
       WellKnownFolderName.Inbox, ConflictResolutionMode.AutoResolve, 
       MessageDisposition.SaveOnly, null);
    // ABOVE LINE CAUSES EXCEPTION
    return emailsList;
}

请注意,我拉起了IsRead属性,在将项目添加到列表之前放置了它。例外情况如下:

无法执行此操作,因为一个或多个项目是新的或未修改的

从 MSDN 的示例中,似乎将 IsRead 设置为 true 就足够了,那么为什么不考虑批量更新的项目呢?

乍一看,这是您在循环外拨打LoadPropertiesForItems电话。这可能会通过从服务器加载值来覆盖您的更改。

这绝不是答案...我只是想检查您是否可以将其格式化为这样

    Folder.Bind(Service, WellKnownFolderName.Inbox);
    var sf = new SearchFilter.SearchFilterCollection(LogicalOperator.And, new SearchFilter.IsEqualTo(EmailMessageSchema.IsRead, false));
    //ItemView limits the results to numOfMails2Fetch items
    var foundItems = Service.FindItems(WellKnownFolderName.Inbox, sf, new ItemView(numOfMails2Fetch)).ToList();
    // fetches the body of each email and assigns it to each EmailMessage
    Service.LoadPropertiesForItems(foundItems,PropertySet.FirstClassProperties);
    //List<EmailMessage> emailsList = new List<EmailMessage>();
    foreach(var item in foundItems)
    {
      var iEM = item as EmailMessage;
      if(iEM != null)
          iEM.IsRead = true;
      //emailsList.Add(iEM);
    }
    // Batch update all the emails
    var response = Service.UpdateItems(foundItems, WellKnownFolderName.Inbox, ConflictResolutionMode.AutoResolve, MessageDisposition.SaveOnly, null);
    return foundItems;
}

相关内容

  • 没有找到相关文章

最新更新