为了账号安全,请及时绑定邮箱和手机立即绑定

EWS错误:超过了1000个项目的最大数量,可以在一个请求中将其删除

EWS错误:超过了1000个项目的最大数量,可以在一个请求中将其删除

C#
牧羊人nacy 2021-04-09 18:14:58
我正在使用EWS Exchange Sync,在我的一种方法中,这就是说我超出了可以在单个请求中删除的1000个项目的最大数量。是否可以解决此问题,而不是从日历中删除所有内容,而只从今天起删除,而不是及时删除?导致错误的方法在这里:        public void DeleteAllSafeAppointments(SCDriftConnection conn, ExchangeService service, SAFEAgent agent) {        if(conn == null)            throw new ArgumentNullException("conn");        if(service == null)            throw new ArgumentNullException("service");        if(agent == null)            throw new ArgumentNullException("agent");        try {            var calendar = GetAgentCalendar(service, agent);            service.DeleteItems(GetAllSafeAppointments(calendar).Select(a => a.Id), DeleteMode.HardDelete, SendCancellationsMode.SendToNone, null);            var scheduledActivitiesOnAgent = ScheduledActivity.GetScheduleToExchange(new QueryParameters<ScheduledActivity>(s => s.Initials == agent.Initials && s.ExchangeId != null));            foreach(var schedAct in scheduledActivitiesOnAgent) {                schedAct.ExchangeId = null;                schedAct.Save(conn);            }            ResetAgentSyncState(calendar, agent);        } catch(Exception ex) {            throw new Exception("An error occured while clearing exchange calendar for " + agent.Initials, ex);        }        agent.ExchangeSyncronizationSettings.LastSync = DateTime.Now;        agent.ExchangeSyncronizationSettings.Save(conn);    }
查看完整描述

2 回答

?
LEATH

TA贡献1936条经验 获得超6个赞

private IEnumerable<Appointment> GetAllSafeAppointments(Folder calendar) {

            ItemView view = new ItemView(512);


            view.PropertySet = new PropertySet(BasePropertySet.IdOnly);


            SearchFilter filter = new SearchFilter.SearchFilterCollection(LogicalOperator.And,

                                                                          new SearchFilter.IsEqualTo(SafeAppointmentFlag, true));


            while(true) {

                var results = SendExchangeRequest(() => calendar.FindItems(filter, view));


                foreach(var r in results.OfType<Appointment>())

                    yield return r;


                if(!results.MoreAvailable)

                    break;


                view.Offset = results.NextPageOffset.Value;

            }

        }


查看完整回答
反对 回复 2021-04-17
?
暮色呼如

TA贡献1853条经验 获得超9个赞

您可以批量处理请求。我为此编写了一个通用批处理方法:


private IEnumerable<IEnumerable<T>> Batch<T>(IEnumerable<T> input, int batchSize)

{

    List<T> items = new List<T>();

    foreach (var item in input)

    {

        items.Add(item);

        if (items.Count == batchSize)

        {

            yield return items;

            items = new List<T>();

        }

    }

    if (items.Count > 0)

    {

        yield return items;

    }

}

现在,您可以使用它将您的物品分成几批:


var batches = Batch(GetAllSafeAppointments(calendar).Select(a => a.Id), 1000);

foreach (var batch in batches)

{

    service.DeleteItems(batch, DeleteMode.HardDelete, SendCancellationsMode.SendToNone, null);

}

现在最多一次将删除1000个。


查看完整回答
反对 回复 2021-04-17
  • 2 回答
  • 0 关注
  • 194 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信