如何使用FindItems()获取在日期范围内有一个或多个出现的所有重复序列的重复主数据?

时间:2014-03-17 20:35:00

标签: exchangewebservices

背景

我正在使用Microsoft Exchange Web服务托管API 2.0。我正在尝试搜索日历文件夹并返回符合以下条件的所有约会项目:

  • 具有正常的敏感度
  • 有一个"测试"
  • 的类别
  • 从特定日期范围开始

我得出结论,由于我需要过滤的不仅仅是我需要使用FindItems()而不是FindAppoinments()的日期。(如果错误,请纠正我。)FindItems()的缺点是它只返回一个循环系列的主人,我需要自己爆炸这些事件。我正在毫无问题地爆炸大师,但是在我的测试中,FindItems()搜索重现的方式遇到了问题。如果整个系列在我的搜索范围内某个时间开始,它似乎只返回一个循环系列的主人。因此,如果有人在下一年每天设置一个定期系列,并且我在下个月搜索日历,则FindItems()不会给出任何迹象表明在该范围内发生了重复发生的系列。

TLDR:

给定具有重复序列的日历,其日常频率从2014年1月1日开始到2014年1月30日结束。如何使用过滤日期范围为2014年1月10日 - 2014年1月20日的FindItems()来返回该系列的定期主数据?

我的代码

// A search collection that contains all of the search conditions.
List<SearchFilter> masterSearchFilterCollection = new List<SearchFilter>();
masterSearchFilterCollection.Add(new SearchFilter.IsEqualTo(ItemSchema.ItemClass, "IPM.Appointment"));

masterSearchFilterCollection.Add(new SearchFilter.IsEqualTo(AppointmentSchema.Sensitivity, Sensitivity.Normal)); //No Private items
//masterSearchFilterCollection.Add(new SearchFilter.ContainsSubstring(AppointmentSchema.Categories, "Test"));

List<SearchFilter> dateRangeSearchFilterCollection = new List<SearchFilter>();
dateRangeSearchFilterCollection.Add(new SearchFilter.IsGreaterThanOrEqualTo(AppointmentSchema.Start, searchStartDateTime));
dateRangeSearchFilterCollection.Add(new SearchFilter.IsLessThanOrEqualTo(AppointmentSchema.Start, searchEndDateTime));
masterSearchFilterCollection.Add(new SearchFilter.SearchFilterCollection(LogicalOperator.And, dateRangeSearchFilterCollection));

SearchFilter searchFilter = new SearchFilter.SearchFilterCollection(LogicalOperator.And, masterSearchFilterCollection);

ItemView view = new ItemView(pageSize, initialOffset);
view.PropertySet = GetPrimaryProperties();
FindItemsResults<Item> results = Service.FindItems(Folder, searchFilter, view);

foreach(Appointment item in results)
{
   if (item.AppointmentType == AppointmentType.RecurringMaster)
   {
      // Calendar item is a recurring master item for a recurring series.
      // Loop through all occurrences of the master here
   }
   else
   {
      // Calendar item is not part of a recurring series.
   }
}

1 个答案:

答案 0 :(得分:5)

约翰,

要查找定期主预约,您需要使用FindAppointments()方法。在此方法中指定开始日期和结束日期将允许您查看跨越日期范围的任何定期约会。然后,您可以通过选中这些约会的灵敏度和类别属性来过滤约会

找到符合条件的约会后,请检查AppointmentType属性以确定下一步操作。如果它是一次出现或异常,那么您可以使用Appointment.BindToRecurringMaster()方法访问您的定期主人。这是一个例子:

switch (calendarItem.AppointmentType)
{
    case AppointmentType.RecurringMaster:
       // Nothing to do here since you are already on the recurring master
       break;

    case AppointmentType.Single:
       // This is not a recurring series
       break;

    case AppointmentType.Occurrence:
       // We need to get to the recurring master
       Appointment recurringMaster = Appointment.BindToRecurringMaster(service, calendarItem.Id);
       break;

    case AppointmentType.Exception:
       // We need to get to the recurring master
       Appointment recurringMaster = Appointment.BindToRecurringMaster(service, calendarItem.Id);
       break;

}

现在你有了对定期主人的引用,你可以像以前一样循环这些事件。

我希望这会有所帮助。