如何通过EWS获取主重复约会?查询重复约会时如何只返回单条记录
如何通过EWS获取主重复约会
我来帮你搞定这个问题!当你用folder.findAppointments(cView)查询时,默认会自动展开重复约会的所有实例,所以才会拿到同一系列的多条记录。要只获取每个重复约会的主记录(也就是重复系列的母项),有两个靠谱的解决方法,我给你详细说下:
方法一:用FindItems替代FindAppointments(推荐)
FindAppointments是专门针对日历视图的方法,它默认会展开重复系列的所有实例。而FindItems不会自动展开,我们可以通过搜索过滤器直接筛选出主约会,效率更高。
具体代码示例:
// 创建搜索过滤器:只匹配重复的主约会 SearchFilter searchFilter = new SearchFilter.SearchFilterCollection(LogicalOperator.And, new SearchFilter.IsEqualTo(AppointmentSchema.IsRecurring, true), new SearchFilter.IsEqualTo(AppointmentSchema.AppointmentType, AppointmentType.Master)); // 使用FindItems查询日历文件夹 FindItemsResults<Item> results = service.FindItems(WellKnownFolderName.Calendar, searchFilter, new ItemView(100)); // 将结果转换为Appointment列表 List<Appointment> masterAppointments = results.Cast<Appointment>().ToList();
为什么这个方法有效?
AppointmentType.Master标记的就是重复系列的主约会,配合IsRecurring=true的条件,能精准筛选出所有重复约会的主记录。FindItems不会自动展开重复实例,所以返回的每条记录都是独立的主约会,没有冗余数据。
如果你需要限定时间范围,也可以给搜索过滤器加上时间条件,比如:
// 加入时间范围过滤:只找2024年的主约会 SearchFilter dateFilter = new SearchFilter.IsGreaterThanOrEqualTo(AppointmentSchema.Start, new DateTime(2024, 1, 1)); searchFilter.Add(dateFilter);
方法二:对FindAppointments的结果去重(适合必须用CalendarView的场景)
如果因为业务需求必须用FindAppointments,那可以在返回结果后手动去重,保留每个重复系列的主约会:
FindItemsResults<Appointment> results = folder.FindAppointments(cView); // 用字典去重,键为主约会的唯一ID Dictionary<string, Appointment> masterAppointmentMap = new Dictionary<string, Appointment>(); foreach (Appointment appt in results) { if (appt.AppointmentType == AppointmentType.Master) { // 如果是主约会,直接加入字典 masterAppointmentMap[appt.Id.UniqueId] = appt; } else if (appt.RecurrenceMasterId != null && !masterAppointmentMap.ContainsKey(appt.RecurrenceMasterId.UniqueId)) { // 如果是重复实例,且对应的主约会还没被记录,就绑定获取主约会 Appointment masterAppt = Appointment.Bind(service, appt.RecurrenceMasterId); masterAppointmentMap[masterAppt.Id.UniqueId] = masterAppt; } } // 最终得到去重后的主约会列表 List<Appointment> masterAppointments = masterAppointmentMap.Values.ToList();
注意事项
- 这个方法的缺点是先拉取了所有重复实例,数据量较大时效率不如方法一。
- 如果你的CalendarView时间范围没有包含主约会的起始时间,可能只会返回重复实例,这时候需要额外调用
Appointment.Bind去获取主约会,会多一次API请求。
内容的提问来源于stack exchange,提问作者im_mangesh
相关产品推荐
相关产品推荐

