簡體   English   中英

在SharePoint 2010 CAML查詢中比較日期

[英]Comparing dates in Sharepoint 2010 CAML query

嘗試查詢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子句匹配的日期。

讓我知道是否可以提供更多信息。

這與日期或如何進行日期無關。 您將看到嘗試在此列表上執行的幾乎所有類型的過濾的此問題。

這是因為列表視圖閾值與結果集的大小無關。

任何中間結果集大於閾值時,都會觸發LVT。 您的查詢需要搜索所有[列表大小]項,以便找出哪些項小於/大於要搜索的日期。 結果集小於LVT的事實無關緊要; SharePoint在那之前很久就放棄了。

當然,如果您的“創建日期”字段上有索引,則無需搜索[列表大小]項目即可找出該范圍內的所有日期。 能夠使用索引僅對那些項目正確,因此在這種情況下,只要您的結果集小於LVT,就可以了。

因此,對於實際解決方案,您可以:

  • 向該列添加索引。 它可能滿足您的目的,也可能不夠,因為您可能或可能無法確保每個查詢每次都可以使用索引列來過濾列表,使其小於LVT。

  • 將LVT增加到大於列表的大小。

  • 禁用此列表的LVT。

  • 覆蓋此查詢的LVT(可以在代碼中執行查詢時完成)

  • 確保他們是LVT較高的管理員用戶(可能是特權升級)。

  • 將列表縮小,使其在LVT之下。

    • 對此的一種變化是將項目放入文件夾,其中每個文件夾的大小均小於LVT。 然后,您可以對每個文件夾進行查詢而不會出現問題(因為items文件夾是索引列)。
  • 將整個列表下拉到內存中(比LVT少的頁面),然后對內存中對象執行查詢。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM