0

我的 C# 应用程序在 SharePoint 外部运行,因此我将 CSOM 与 Caml 查询一起使用。我想查找安排在一天内的所有日历事件,单次和重复。我收到了与我选择的日期重叠的所有重复日历事件,即使它们在相关日期没有任何预定事件。单个事件被正确过滤并返回。如何将重复事件过滤为仅在给定日期触发的事件?使用任务列表而不是日历列表更容易吗?

var today = DateTime.UtcNow.ToString(@"yyyy-MM-ddT12:00:00Z");

var query = new CamlQuery {
   ViewXml = @"<View>              
     <ViewFields>
        <FieldRef Name='ID' />
        <FieldRef Name='Title' />
        <FieldRef Name='EventDate' />
        <FieldRef Name='EndDate' />
        <FieldRef Name='Description' />
        <FieldRef Name='Category' />
        <FieldRef Name='fRecurrence' />
        <FieldRef Name='RecurrenceData' />
        <FieldRef Name='fAllDayEvent' />
     </ViewFields> 
     <Query>
        <Where>
           <DateRangesOverlap>
              <FieldRef Name='EventDate'></FieldRef>
              <FieldRef Name='EndDate'></FieldRef>
              <FieldRef Name='RecurrenceID'></FieldRef>
              <Value Type='DateTime'><Today/></Value>
           </DateRangesOverlap>
        </Where>
        <OrderBy><FieldRef Name='EventDate' /></OrderBy> 
     </Query>
     <QueryOptions>
        <CalendarDate>"+ today + @"</CalendarDate>
        <RecurrencePatternXMLVersion>v3</RecurrencePatternXMLVersion>
        <ExpandRecurrence>TRUE</ExpandRecurrence>
     </QueryOptions>
     </View>"
   };
4

1 回答 1

0

可以从客户端使用DateRangesOverlapCAML 运算符和ListsWeb 服务(在客户端 OM 或 OData / REST 中不支持!),请参阅此处的描述。

您可以将当前日期的变量定义为:

var today = DateTime.UtcNow.Date;
var todayAsString = today.ToString("yyyy-MM-dd");

然后,您可以在查询中使用它的值来限制今天安排的事件的结果:

string.Format("<Query><Where><And><Eq><FieldRef Name='EventDate' /><Value Type='DateTime' IncludeTimeValue='FALSE'>{0}</Value></Eq><Eq><DateRangesOverlap><FieldRef Name='EventDate' /><FieldRef Name='EndDate' /><FieldRef Name='RecurrenceID' /><Value Type='DateTime'><Month/></Value></DateRangesOverlap></And></Where><Query>", todayAsString);

但是根据我的经验,这种查询不会像您预期的那样工作。如果您DateTime在查询之外包含另一个基于条件的条件,DateRangesOverlap则不会再次展开重复事件。来自 SharePoint 的另一个“善意”惊喜。重复事件的扩展似乎只有在您使用时才有效DateRangesOverlap,并且您在查询中仅使用这种DateTime基于 - 的条件(但没有其他条件,例如<Eq><Gt>DateTime字段结合使用)。

但是,您可以结合DateRangesOverlap其他类型的条件(例如<Eq>or <Gt>),只要它们与其他字段类型相关,例如Numberor Text

这意味着您应该查询当前月份中的所有事件(如CAML上面的示例查询),例如通过设置CalendarDate QueryOption, 然后您应该在代码中添加一个带有额外条件的循环(我的意思是 C# 或 JavaScript,而不是在 CAML !) 将事件日期与当前日期进行比较。真的很麻烦。

于 2017-01-18T10:46:43.550 回答