比较Sharepoint 2010 CAML查询中的日期

时间:2014-06-11 16:49:41

标签: c# sharepoint-2010 caml

尝试查询Sharepoint列表时,我遇到了一个有趣的问题。

以下是目前的查询:

camlQuery.ViewXml = new XElement("View",
    new XElement("Query",
        new XElement("Where",
            new XElement("And",
                new XElement("Geq",
                    new XElement("FieldRef", new XAttribute("Name", "Created_x0020_Date")),
                    new XElement("Value", new XAttribute("IncludeTimeValue", "TRUE"), new XAttribute("Type", "DateTime"), InStartDate.Get(context))),
                new XElement("Leq",
                    new XElement("FieldRef", new XAttribute("Name", "Created_x0020_Date")),
                        new XElement("Value", new XAttribute("IncludeTimeValue", "TRUE"), new XAttribute("Type", "DateTime"), InEndDate.Get(context))))))).ToString();

Created_x0020_Date列就在创建行时。

有趣的是,无论我的开始日期和结束日期是什么,查询错误都会出现“禁止尝试的操作,因为它超出了管理员强制执行的列表视图阈值”。该错误似乎认为我返回的行数多于阈值准备处理的行数。但即使我的结束日期在我的开始日期之前,也会发生此错误,这应该意味着找不到与where子句匹配的日期。

如果我能提供更多信息,请告诉我。

1 个答案:

答案 0 :(得分:1)

这与日期或它们的比较方式毫无关系。您会在此列表中尝试执行的任何类型的过滤都会看到此问题。

这是因为列表视图阈值与结果集的大小无关。

只要中间结果集大于阈值,就会触发LVT。您的查询需要搜索所有[列表大小]项目,以便找出哪些项目小于/大于您搜索的日期。 结果集小于LVT这一事实并不重要;在很久以前,SharePoint就会放弃你。

当然,如果您的“创建日期”字段上有索引,那么它不需要搜索[列表大小]项目来计算该范围内的所有日期。它能够使用索引来正确处理那些项目,所以在这种情况下,只要你的结果集小于LVT你就可以了。

对于实际解决方案,您可以:

  • 为此列添加索引。它可能或可能不足以满足您的目的,因为您可能或可能无法确保每个查询都可以使用索引列将列表过滤到每次低于LVT。

  • 将LVT增加到大于列表的大小。

  • 禁用此列表的LVT。

  • 覆盖此查询的LVT(可以在代码中执行查询时完成)

  • 确保用户是管理员用户(可能是权限升级),因为他们拥有更高的LVT。

  • 使列表变小,使其低于LVT。

    • 对此的一个变体是将项目放入每个文件夹小于LVT的文件夹中。然后,您可以对每个文件夹执行查询而不会出现问题(因为项目文件夹是索引列)。
  • 将整个列表下拉到内存中(在低于LVT的页面中)并对内存中的对象执行查询。