Introduction
CAML (Collaboration Application Markup Language) là một ngôn ngữ truy vấn dựa trên cấu trúc XML giúp truy vấn, xây dựng và các site dựa trên các Windows SharePoint Service. Các thành phần XML định nghĩa các phương diện khác của một WSS site.
Trong bài viết này, chúng ta sẽ tìm hiểu cách xây dựng và thực thi các truy vấn CAML để lấy các list item từ một SharePoint list. Các list item có thể được lấy bằng nhiều các khác nhau: sử dụng SharePoint object model, sử dụng SharePoint web service hoặc thậm chí sử dụng Powershell. Sử dụng SharePoint object model khi code của bạn chạy trên server (chẳng hạn như bạn đang phát triển một web part hoặc một trang ứng dụng). Sử dụng các SharePoint Web Service khi code của bạn không chạy trên server nơi mà SharePoint được cài đặt, chẳng hạn khi bạn phát triển các office client hoặc các ứng dụng windows. Mặt khác, Powershell có thể được sử dụng bởi các quản trị viên khi họ cần lấy một số thông tin nhanh chóng. Dù theo cách nào thì truy vấn CAML cũng tương tự như vậy.
Building the CAML
CAML là ngôn ngữ truy vấn dựa trên cấu trúc XML. Nút gốc của nó là Query. Trong nút Query, 2 nút khác có thể có là OrderBy và Where (không bắt buộc).
Nút OrderBy là nút đơn giản nhất. Nó được sữ 3 dụng để sắp xếp các list item trả về. Bạn phải xác định (các) trường mà bạn muốn sắp xếp các item và hướng sắp xếp. Cú pháp của nó như sau:
Mệnh đề OrderBy là không bắt buộc và bạn có thể xác định một hoặc nhiều trường mà bạn muốn sắp xếp. Nếu bạn khai báo thuộc tính Ascending, các dòng kết quả của bạn sẽ được sắp xếp tăng dần. Nếu bạn muốn thực hiện giảm dần, bạn chỉ việc gán Ascending=”False”.
Mệnh đề Where được sử dụng để xác định một hay nhiều tiêu chí chọn lọc. Mệnh đề này có thể rất đơn giản nhưng đôi khi nó khá là phức tạp.
Operators
Toán tử | Ý nghĩa |
Eq | Equals |
Neq | Not equal |
Gt | Greater than |
Geq | Greater than or equal |
Lt | Less than |
Leq | Lower than or equal |
IsNull | Is null |
BeginsWith | Begins with |
Contains | Contains |
Fields
Thành phần FieldRef có thể là bất kì trường nào của list mà bạn muốn thực hiện truy vấn CAML. Nếu bạn sử dụng thuộc tính Name, bạn cần xác định tên “nội” của trường này. Ngoài ra, bạn cũng cần sử dụng thuộc tính IDđể xác định Guid của trường.
Value
Thành phần Value xác định phần giá trị của tiêu chí. Thuộc tính Type là tùy chọn và xác định kiểu dữ liệu của trường mà bạn muốn xác định tiêu chí. Nếu bạn bỏ qua kiểu dữ liệu thì sẽ mặc định là kiểu Text. Trong tất cả các trường hợp khác, bạn phải xác định thuộc tính Type. Các trường DateTime là một trường hợp đặc biệt và sẽ được mô tả sau.
Nếu kiểu trường là một Lookup, bạn cần xác định giá trị text. Ví dụ, bạn có một Employees list và trường Country là một trường lookup chỉ đến Countries list. Trong trường hợp đó, một employee sống ở Belgium sẽ có giá trị sau: Belgium. Nếu bạn phải truy vấn cho các employee sống ở Belgium, bạn sẽ phải viết câu truy vấn như sau:
Bạn có thể thấy đây là một kinh nghiệm code không tốt vì tên của quốc gia có têể hay đổi theo thời gian. Trong trường hợp đó, bạn cần truy vấn theo id của quốc gia bằng cách xác định thuộc tính LookupId trong thành phầnFieldRef:
Nếu bạn muốn xác định 2 tiêu chí chọn lọc, bạn cũng phải xác định một toán tử And hoặc Or.
Nếu bạn muốn xác định nhiều tiêu chí lựa chọn hơn, bạn phải tổ chức theo một cách cụ thể:
Với mỗi tiêu chí thêm vào, bạn phải thêm một toán tử kết hợp bên ngoài câu truy vấn và thêm tiêu chí vào cuối:
Retrieving List Items with CAML using the SharePoint Object Model
Nếu bạn cần lấy các item từ một list khi phát triển các web part, các trang ứng dụng hoặc các kiểu trường tùy chọn, bạn có thể ưử dụng đối tượng SPQuery từ SharePoint object model. Đối tượng này nằm trongMicrosoft.SharePoint namespace của Microsoft.Sharepoint.dll được lưu trong GAC.
Thiết lập đối tượng này như sau:
Thuộc tính quan trọng nhất là thuộc tính Query cần được thiết lập cho truy vấn CAML của bạn:
Váo lúc này, bạn có thể thực thi câu truy vấn trên list của bạn:
SPListItemCollection listItemsCollection = list.GetItems(qry);
Một nhậc xét nhỏ về phương thức GetItems của đối tượng SPList: phương thức này trả về một tập hợp của kiểu SPListItemCollection. Nó có thể sẽ dàng làm việc với một DataTable. Trong trường hợp đó, bạn có thể thực thi truy vấn sau:
DataTable listItemsTable = list.GetItems(qry).GetDataTable();
Câu truy vấn không chỉ trả về các item của list mà có Last Name là Smith, mà còn tất cả các cột của từng item của list. Trong các trường hợp mà bạn làm việc với các list lớn, để lấy một tập con của các item của list chứa duy nhất những cột bạn cần là điều quan trọng. Trong trường hợp đó, bạn sẽ phải thiết lập thuộc tính ViewFieldscủa đối tượng SPQuery. Bạn có thể làm việc này bằng cách xác định các cột mà bạn muốn được trả về:
qry.ViewFields = “<FieldRef Name=”FirstName” /><FieldRef Name=”LastName” />”;
Câu truy vấn này sẽ trả về First Name và Last Name của các employee được lấy, ngoài ra còn có những trường hệ thống như ID và CreatedDate.
Khuyết điểm lớn nhất của đối tượng SPQuery là bạn có thể truy vấn được duy nhất 1 list. Nếu bạn muốn truy vấn nhiều hơn, bạn sẽ phải sử dụng SPSiteDataQuery.
Retrieving List Items with CAML using the SharePoint Web Services
Nếu bạn đang phát triển các office client hoặc bất kì ứng dụng nào khác mà không chạy trên server nơi SharePoint được cài đặt, bạn sẽ cần sử dụng các SharePoint Web Service để lấy (hoặc cập nhật) thông tin từ SharePoint. Nếu bạn muốn truy vấn một list, bạn sẽ cần thực thi phương thức GetListItems từ Lists.asmxSharePoint web service.
Retrieving List Items from the Lists.asmx using Visual Studio 2008/2010
Trước tiên là bạn phải thêm Service Reference đến Lists.asmx web service. Nếu bạn không muốn làm việc không đồng bộ, bạn phải bỏ check trong tùy chọn Generate Asynchronous Operations trong hộp thoạiAdvanced. Khi đóng hộp thoại, Visual Stuio sẽ tự động thêm vào một tập tin app.config hoặc web.config. Mở tập tin này và trỏ tới mục security. Đoạn xml sau được tạo ra tự động:
Thay thế đoạn mã đó bằng đoạn mã sau:
Trở lại phần code của bạn và thiết lập web service:
Bạn cũng phải đặt các credential cần thiết. Nếu bạn có thể làm việc ơới các credential mặc định, bạn có thể viết như sau:
Nếu cần thiết, bạn cũng có thể truyền vào user name, password và domain:
Nếu cần thiết nữa, bạn có thể đặt URL tới web service:
Bây giờ bạn có thể gọi phương thức GetListItems của web service.