2008-12-02 23 views
21

Tôi đang sử dụng truy vấn caml để chọn tất cả tài liệu đã được người dùng sửa đổi hoặc thêm. Truy vấn chạy đệ quy trên tất cả các trang con của tuyển tập site được chỉ định.Truy vấn CAML: cách lọc thư mục từ tập hợp kết quả?

Bây giờ vấn đề là tôi không thể loại bỏ các thư mục cũng là một phần của tập hợp kết quả. Bây giờ tôi đang lọc chúng từ kết quả có thể datatable. Nhưng tôi tự hỏi: Có thể lọc ra các thư mục từ tập kết quả chỉ bằng cách sử dụng caml không?

Trả lời

22

này CAML thực sự thực hiện thủ thuật:

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

sẽ không cung cấp cho bạn bất kỳ thư mục nào.

+0

Đã cố gắng nhưng không hoạt động. Chỉ hiển thị các thư mục - không có dữ liệu. – JohnnyBizzle

+0

Tôi tìm kiếm một truy vấn chỉ có thư mục mà tôi đã tìm đến chủ đề này. Truy vấn CAML này thực sự làm việc cho tôi trên SharePoint 2013. Tôi đã thay đổi int thành 1 ofcourse, nhưng 0 hoạt động tốt nếu bạn chỉ muốn các tệp. – Martin

+2

này hoạt động từ CSOM 0

12

Vì vậy, tôi đã tìm ra :) Bạn có thể sử dụng FieldRef = 'ContentType' trong truy vấn caml và chỉ định loại nội dung bạn muốn chọn hoặc loại trừ khỏi lựa chọn.

Vì vậy, trong trường hợp của tôi, tôi đã thêm điều kiện này để thể hiện CAML tôi:

<Neq><FieldRef Name='ContentType' /><Value Type='Text'> Folder </Value></Neq>

LƯU Ý: Có những vấn đề trong thiết lập đa ngôn ngữ. Tên của loại nội dung có thể khác nhau, vì vậy nó là tốt để có được tên của các loại nội dung từ nguồn

UPDATE:

Dường như tôi đã quá nhanh chóng trong các giả định của tôi. Tôi cần phải lọc ra tất cả các loại nội dung dựa trên loại nội dung thư mục, vì trong các dự án của chúng tôi, các loại nội dung này được sử dụng: (

Tôi không thể tạo truy vấn khả thi trong caml, vì vậy tôi đã thêm phần tử trường xem vào truy vấn của mình chọn ContentTypeId của mục danh sách và tôi hàng lọc ra được dựa trên kiểu nội dung thư mục.

Mã để làm điều này là không đáng kể, nhưng nó làm tôi bực mình rằng nhiệm vụ đơn giản như vậy không thể được thực hiện bằng CAML tinh khiết.

+4

Tôi đã bình chọn câu trả lời của bạn vì câu trả lời của Johan Leino hoạt động trên SharePoint 2013. Đó sẽ là câu trả lời được chấp nhận kể từ bây giờ. – Martin

+0

Tôi đã bỏ phiếu này vì lệnh gọi REST không thành công cho '$ filter = FSObjType eq 0' vì một số lý do lạ. ContentTypeId hoạt động, mặc dù trông giống như một hack. – nawfal

+0

Một số thông tin ở đây: http://sharepoint.stackexchange.com/questions/124846/rest-with-filter-for-list-items-in-sharepoint-2013 – nawfal

3

Nếu bạn đang làm việc với các thư mục và bạn đang sử dụng đối tượng SPQuery, bạn cũng có thể muốn sử dụng trường ViewAttributes để cho phép truy xuất mục đệ quy. Đặt giá trị thành Scope = "Recursive" sẽ truy xuất các mục từ các thư mục con và sẽ không truy xuất các đối tượng thư mục trong tập kết quả.

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

Đây là những gì làm việc cho tôi

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

Đã cố gắng nhưng không hoạt động. Chỉ hiển thị các thư mục - không có dữ liệu. – JohnnyBizzle

0

Kiểm tra câu trả lời khác của tôi CAML query that includes folders in result set

Đơn giản chỉ cần thay đổi các nhà khai thác có thể giúp bạn có được những gì bạn cần

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

Tôi không chắc chắn nếu điều đó sẽ làm việc.

4

Theo kết quả từ CAML Designer (tạo ra bởi Karine Bosch và Andy Van Steenbergen và phân phối bởi Belux Thông tin Worker User Group) cú pháp CAML đúng là:

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

Tôi đã thử nghiệm này trong PowerShell và đã nhận được kết quả mong đợi:

$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 

bạn có thể thay thế thẻ <QueryOptions> trong CAML với ViewAttributes sở hữu đối tượng SPQuery nếu bạn thích, ví dụ $qry.ViewAttributes = “Scope=’RecursiveAll’".

Khi kiểm tra điều này, hãy chắc chắn tái khởi tạo đối tượng SPQuery mỗi khi bạn không thể gán lại thuộc tính truy vấn đơn giản. Khi truy vấn đã được thực hiện, bất kỳ giá trị mới nào được gán cho thuộc tính Truy vấn đều bị bỏ qua. Vì vậy, hãy thực hiện toàn bộ đoạn PowerShell.

0

Đối với tôi cũng nó làm việc như văn bản dưới đây: -

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

1 Atul

1

Dave T.'s answer không làm việc cho tôi, nhưng dùng nó như là một nguồn cảm hứng ở đây là những gì tôi đã đưa ra:

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

Các chính vấn đề là chúng tôi chỉ có thể biết ContentTypeId ở cấp trang web, bởi vì khi một loại nội dung được thêm vào danh sách/thư viện, nó sẽ trở thành một loại nội dung danh sách danh sách và ID của nó là được trang với GUID khác (0x010100 ...). Và có không có NotBeginsWith điều kiện trong CAML, vì vậy chúng tôi không thể lọc ra các thư mục, nhưng chúng tôi có thể bao gồm tài liệu chỉ id loại nội dung trang web là 0x0101.

Giải pháp với trường FSObjType không hoạt động vì tôi có thư viện có nhiều tệp hơn ngưỡng để tất cả các trường trong truy vấn phải được lập chỉ mục và tôi chưa tìm cách lập chỉ mục trường này .

Các vấn đề liên quan