2008-12-04 114 views
5

CAML我可以查詢SharePoint Listitems使用「包含」元素,但沒有「不包含」我可以使用的元素。「不包含」CAML中?

那麼獲取不包含字符串的項目的最佳方法是什麼?有沒有更好的方法,而不是遍歷每一個項目?

回答

4

BeginWith也適用同樣的限制。我不知道有什麼好的解決辦法。你可以做什麼:做一個Contains-Query,遍歷每個項目並獲取ID,然後爲「ID NotEqual 1或ID NotEqual 2或ID NotEqual 3 ......」做另一個大查詢。由於ID被索引爲據我所知,這對數據庫應該有一個較小的影響,但它仍然聞起來真的很糟糕。

對於小列表無關緊要,對於較大的列表,我會使用SQL Server Profiler來查看影響是什麼。

+0

它聞起來真的不好,你有沒有嘗試過,除了查詢的其他部分使用計算列? – 2010-03-04 21:28:23

+0

@AlexanderN例如,如果您正在篩選Created字段或其他屬於內容類型一部分的字段(這些字段在列列表中看起來不可用),則計算列並不總是有效。 – 2010-03-04 21:35:08

0

'Contains'和'BeginsWith'的問題也困擾我。我希望在下一個版本的SharePoint中,caml將被擴展爲真正的工具,而不僅僅是我們的腿。

我這樣做的方式是儘可能指定查詢,然後篩選與C#代碼中的條件不匹配的行。這有時候非常難看,因爲有時你必須處理100行,並以符合條件的1個結果結束。

0

@drax:讓我們希望CAML消失 - 期間。這絕對是當前SP編程最糟糕的一個方面。

3

那麼得到不包含字符串的 項目的最佳方法是什麼?

嘗試使用計算列來反映您通過創建相反值所查看的值。

例如,說該列被稱爲IsCritical。那麼,作爲 「YES/NO」 和公式加列

=ISNUMBER(FIND("Critical"), [Title])) 

然後在你的CAML查詢

<Query> 
<Where> 
    <Eq> 
    <FieldRef Name='IsCritical'/> 
    <Value Type='Boolean'>0</Value> 
    </Eq> 
</Where> 
</Query> 

A 0在此查詢還挺體現 「並不重要」。然而,我不確定可能會有什麼表現,而不是有一個原生的CAML「Not Containts」,不幸的是它不存在。

請參見CAML Query Schema at MSDN

0

儘量不包括

<NotIncludes> 
<FieldRef Name='FileLeafRef' /> 
              <Value Type='Text'>stringvalue</Value> 
             </NotIncludes>