【问题标题】:Extra Recurring Calendar Events Returned By Caml Query For Single DayCaml查询单日返回的额外定期日历事件
【发布时间】:2014-05-18 22:17:13
【问题描述】:

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

【问题讨论】:

  • 这是典型的学校练习。我不使用 CAML,但 AFAIK 没有本地方法可以做到这一点。我的赌注是获得重叠的任务,然后计算/检查它是否在当前/选定的日期触发。
  • 嗯,这不是为了学校,也不是练习,恐怕你对计算/检查过程是正确的。它似乎没有在任何地方记录。我还在寻找答案。

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


【解决方案1】:

可以从客户端使用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);

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

但是,您可以将 DateRangesOverlap 与其他类型的条件(例如 &lt;Eq&gt;&lt;Gt&gt;)结合起来,只要它们与其他字段类型相关,例如 NumberText

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

【讨论】:

    猜你喜欢
    • 2011-03-02
    • 2013-01-01
    • 2012-01-22
    • 1970-01-01
    • 2013-03-06
    • 1970-01-01
    • 2011-10-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多