2008-12-02 39 views
21

我正在使用caml查詢來選擇用戶修改或添加的所有文檔。查詢在指定網站集的所有子網站上遞歸運行。CAML查詢:如何從結果集中篩選文件夾?

現在的問題是我無法擺脫也是結果集的一部分的文件夾。現在我正在從結果數據表中過濾它們。但我想知道:是否有可能通過使用caml過濾掉結果集中的文件夾?

回答

22

這CAML其實也有訣竅:

<Where> 
    <Eq> 
     <FieldRef Name='FSObjType' /> 
     <Value Type='Integer'>0</Value> 
    </Eq> 
</Where> 

這將不會給你任何文件夾。

+0

試過這個,但沒有奏效。只顯示文件夾 - 沒有數據。 – JohnnyBizzle 2010-12-16 17:43:58

12

因此,我想通了:) 您可以在您的caml查詢中使用FieldRef ='ContentType',並指定要從select中選擇或排除的內容類型的類型。

所以在我的情況我已經添加了這個條件,我的CAML表達:

<Neq><FieldRef Name='ContentType' /><Value Type='Text'>文件夾</Value></Neq>

注: 有在多國語言設置問題。內容類型的名稱可以是不同的,所以這是好事,從資源獲取

內容類型的名稱

UPDATE:

它看起來像我是在我的假設太快。我需要根據文件夾內容類型過濾出所有類型的作品,因爲在我們的項目中使用了以下內容類型:(

我無法在caml中創建可行的查詢,因此我將查看字段元素添加到了我的查詢中選擇是基於文件夾的內容類型和我的列表項的ContentTypeId篩選出的行。

代碼做,這是小事,但它困擾我,這種簡單的任務不能純CAML來完成。

+4

由於Johan Leino的答案適用於SharePoint 2013,因此我低估了您的答案。這應該是現在已被接受的答案。 – Martin 2015-01-07 08:27:25

+0

我提高了這一點,因爲由於某種奇怪的原因,REST調用失敗了'$ filter = FSObjType eq 0`。 ContentTypeId的作品,雖然看起來像一個黑客。 – nawfal 2016-02-04 19:53:10

+0

一些信息在這裏:http://sharepoint.stackexchange.com/questions/124846/rest-with-filter-for-list-items-in-sharepoint-2013 – nawfal 2016-02-05 06:39:30

3

如果您正在使用文件夾並且正在使用SPQuery對象,那麼您也可能想使用ViewAttributes字段來允許遞歸項檢索。將值設置爲Scope =「Recursive」將從子文件夾中檢索項目,並且不會檢索結果集中的文件夾對象。

myQuery.ViewAttributes = "Scope=\"Recursive\""; 
0

這是爲我工作

<Where> 
     <Eq> 
     <FieldRef Name='FSObjType' /> 
     <Value Type='Number'>1</Value> 
     </Eq> 
    </Where> 
0

檢查我的其他答案CAML query that includes folders in result set

簡單地改變運營商可能會得到你所需要的

<Where> 
    <NotIncludes> 
    <FieldRef Name='ContentTypeId' /> 
    <Value Type='ContentTypeId'>0x0120</Value> 
    </NotIncludes> 
</Where> 

我不是當然,如果那會工作。

4

CAML Designer輸出(通過卡林納博世和安迪·範·斯滕貝亨創建和分發由Belux信息工作者用戶組)的正確CAML語法是:

<Where> 
    <Eq> 
    <FieldRef Name='FSObjType' /> 
    <Value Type='Integer'>0</Value> 
    </Eq> 
</Where> 
<QueryOptions> 
    <ViewAttributes Scope='RecursiveAll' /> 
</QueryOptions> 

我在PowerShell中測試了這一點,並得到了預期的結果:

$qry = new-object Microsoft.SharePoint.SPQuery 
$qry.Query = "<Where><Eq><FieldRef Name='FSObjType' /><Value Type='Integer'>0</Value></Eq></Where><QueryOptions><ViewAttributes Scope='RecursiveAll' /></QueryOptions>" 

$items = $lib.GetItems($qry) 
$items.Count 

,如果你願意的話,也就是$qry.ViewAttributes = 「Scope=’RecursiveAll’"您可以替換與SPQuery對象屬性ViewAttributes的CAML的<QueryOptions>標籤。

當測試時,確保每次都重新實例化SPQuery對象,因爲您無法簡單地重新分配查詢屬性。一旦查詢被執行,任何分配給Query屬性的新值都將被忽略。所以執行整個PowerShell片段。

0

對我來說也是它的工作是寫如下: -

<Where><Eq><FieldRef Name='FSObjType' /><Value Type='Integer'>1</Value></Eq></Where> 
1

Dave T.'s answer我沒有工作,但以它爲這裏的靈感是我想出了:

<Where> 
    <BeginsWith><FieldRef Name="ContentTypeId" /> 
    <Value Type="ContentTypeId">0x0101</Value> 
    </BeginsWith> 
</Where> 

主要問題在於我們只能知道ContentTypeId在網站級別上,因爲當內容類型被添加到列表/庫時,它將成爲列表內容類型,其ID是使用另一個GUID(0x010100 ...)進行填充。並且在CAML中有no NotBeginsWith條件,所以我們不能過濾出文件夾,但我們可以包含文檔哪些網站內容類型ID是0x0101

FSObjType領域的解決方案不適合我,因爲我有大於閾值遠遠更多的文件庫,以便查詢中的所有字段必須被索引,我還沒有找到一種方法來索引這個領域。