EWS - 无法执行此操作,因为一个或多个项目是新的或未修改的
EWS - This operation can't be performed because one or more items are new or unmodified
关于我之前问过的关于使用 , I could use ExchangeService.UpdateItems
according to 的批量更新问题。
所以我做了相应的修改:
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
属性,在将项目添加到列表之前放置了它。例外情况如下:
This operation can't be performed because one or more items are new or unmodified
从 MSDN's example 看来,将 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;
}
关于我之前问过的关于使用 ExchangeService.UpdateItems
according to
所以我做了相应的修改:
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
属性,在将项目添加到列表之前放置了它。例外情况如下:
This operation can't be performed because one or more items are new or unmodified
从 MSDN's example 看来,将 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;
}