我的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>"
};
答案 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!)来比较事件日期和当前日期。真的很麻烦。