2008-12-04 12 views
5

Trong CAML Tôi có thể truy vấn SharePoint Listitems bằng cách sử dụng "Chứa" -element, nhưng không có "không chứa" -element tôi có thể sử dụng."không chứa" trong CAML?

Vậy cách tốt nhất để lấy các mục không chứa chuỗi là gì? Có cách nào tốt hơn là lặp qua từng mục?

Trả lời

4

Hạn chế tương tự áp dụng cho BeginWith. Tôi không biết bất kỳ giải pháp tốt nào đáng buồn. Bạn có thể làm gì: Thực hiện truy vấn, lặp qua từng mục và nhận ID, sau đó thực hiện một truy vấn lớn khác cho "ID NotEqual 1 hoặc ID NotEqual 2 hoặc ID NotEqual 3 ......" Vì ID được lập chỉ mục là theo như tôi biết, điều đó sẽ có tác động nhỏ hơn đến cơ sở dữ liệu, nhưng nó vẫn có mùi rất tệ.

Đối với danh sách nhỏ nó không quan trọng, cho danh sách lớn hơn tôi muốn sử dụng SQL Server Profiler để xem tác động là gì.

+0

Nó ngửi thấy thực sự tồi tệ, bạn đã cố gắng sử dụng một cột tính thêm vào phần còn lại của câu hỏi của bạn? –

+0

@AlexanderN Cột được tính không phải lúc nào cũng hoạt động, ví dụ nếu bạn đang lọc trên trường Đã tạo hoặc các trường khác là một phần của loại nội dung - những trường đơn giản dường như không có trong danh sách Cột. –

0

Vấn đề này với 'Chứa' và 'Bắt ​​đầuWith' làm phiền tôi. Tôi hy vọng rằng trong phiên bản tiếp theo của Sharepoint caml sẽ được mở rộng để trở thành công cụ thực sự, không chỉ là một tảng đá trên chân của chúng tôi.

Cách tôi làm là chỉ định truy vấn càng nhiều càng tốt và sau đó lọc các hàng không khớp với các điều kiện trong mã C#. Đôi khi nó khá là xấu xí vì đôi khi bạn phải xử lý 100 hàng để kết thúc bằng 1 kết quả phù hợp với điều kiện.

0

@drax: hãy hy vọng CAML biến mất - khoảng thời gian. Nó chắc chắn là một trong những khía cạnh tồi tệ nhất của lập trình SP hiện tại.

+0

Điều đó sẽ tốt đẹp nhưng có nhiều phần của sản phẩm được xây dựng trên đó! –

+1

CAML như một ngôn ngữ định nghĩa danh sách (ONET.xml) là khá khả dụng. CAML là một thay thế SQL là một trò đùa, và thậm chí không phải là một trò đùa hay. –

3

Vậy cách tốt nhất để có được các mục không chứa chuỗi là gì?

Thử sử dụng cột được tính toán để phản ánh giá trị bạn đang tìm kiếm bằng cách tạo giá trị ngược lại.

Ví dụ: giả sử cột được gọi là IsCritical. Sau đó, thêm cột như là một "YES/NO" và công thức như

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

Sau đó, trong truy vấn CAML bạn

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

0 trong truy vấn này kinda phản ánh "không quan trọng". Tuy nhiên tôi không chắc chắn những gì hiệu suất có thể được như trái ngược với việc có một CAML bản địa "Không Containts" mà tiếc là không tồn tại.

Xem Cũng CAML Query Schema at MSDN

0

cố gắng không Bao gồm

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