Caml查询单日返回的额外重复日历事件

时间:2014-05-18 22:17:14

标签: sharepoint sharepoint-2010 sharepoint-2013 office365 csom

我的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>"
   };

1 个答案:

答案 0 :(得分:0)

可以从客户端使用DateRangesOverlap CAML运算符和Lists Web服务(客户端OM或OData / REST中不支持!),请参阅说明here

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

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>或{{ 1}}与<Gt>字段相结合。

然而,您可以将DateTime与其他类型的条件(例如DateRangesOverlap<Eq>)合并,只要它们与其他字段类型相关,例如<Gt>Number

这意味着您应该查询当前月份中的所有事件(如上面的示例Text查询中所示),例如通过设置CAML CalendarDate,那么您应该添加一个循环使用代码中的额外条件(我的意思是C#或JavaScript,而不是CAML!)来比较事件日期和当前日期。真的很麻烦。

相关问题