Sharepoint listelerinde değişik parametreler kullanarak very alma, sıralama vb işlemler için CAML sorguları kullanılabilir. CAML’I bir nevi SQL sorgusu gibi düşünebilirsiniz. Veritabanında SQL sorgusu ne ise Sharepoint’te CAML o anlama gelmektedir.
CAML’ın en büyük avantajı hızlı ve kullanımının basit olmasıdır. CAML sorguları yazılırken başta biraz zorlanılacakmış gibi görülse de third party toollarla sorgular oluşturulup doğrulanarak koda eklenebilir.
Bu işlemi yapmak için Sharepoint tarafında SPQuery isimli sınıfımızı kullanabileceğimiz gibi daha gelişmiş olan SPSiteDataQuery sınıfını da kullanabilmekteyiz. Bu makalemizde SPSiteDataQuery sınıfını inceleyeceğiz. SPQuery’de bir listed eleman sorgulama işlemi yapılmaktaydı. SPSiteDataQuery’de ise SPWeb nesnesi kullanılarak daha karmaşık sorgular oluşturulabilmektedir.
Öncelikle SPSiteDataQuery’nin methodlarına bir göz atalım.
Property/Method | Açıklama |
Query | CAML sorgularını tutar. |
Lists | CAML’daki XML stringinin hangi listelerde uygulanacağını belirtir. |
ViewFields | Sorgu sonucunda gelecek alanları belirler |
RowLimit | Sorguda dönecek satır sayısını belirler |
Webs | CAML’daki XML string ifadesinin hangi weblere uygulanacağını belirtir |
Şimdi bir örnek ile inceleyelim. Örneğimiz için yeni bir Empty Sharepoint Project (Farm solution) oluşturalım ve bir adet Visual Web Part ekleyelim.
Code behind’a geçelim ve şu şekilde düzenleyelim:
- using System;
- using System.Web.UI;
- using System.Web.UI.WebControls;
- using System.Web.UI.WebControls.WebParts;
- using Microsoft.SharePoint;
- using System.Data;
- namespace SPFarmSolution.WebPart_SPSiteDataQuery
- {
- public partial class WebPart_SPSiteDataQueryUserControl : UserControl
- {
- protected void SatirEkle(Table tablo, System.Collections.Generic.List<object> parametreler)
- {
- TableRow satir = new TableRow();
- foreach (object parametre in parametreler)
- {
- TableCell hucre = new TableCell();
- Label label = new Label();
- if (parametre != null)
- label.Text = parametre.ToString();
- hucre.Controls.Add(label);
- satir.Cells.Add(hucre);
- }
- tablo.Rows.Add(satir);
- }
- protected void Page_Load(object sender, EventArgs e)
- {
- Table tablo = new Table();
- SPSiteDataQuery sorgu = new SPSiteDataQuery();
- sorgu.Lists = "<Lists BaseType='0'/>";
- sorgu.Query = "<Where>" +
- "<Contains>" +
- "<FieldRef Name='Title'/>" +
- "<Value Type='Text'>Deneme</Value>" +
- "</Contains>" +
- "</Where>";
- sorgu.Webs = "<Webs Scope='SiteCollection'/>";
- sorgu.ViewFields = "<FieldRef Name='Title'/>";
- sorgu.RowLimit = 2;
- SPWeb web = SPContext.Current.Web;
- DataTable tablo2 = web.GetSiteData(sorgu);
- if (tablo2.Rows.Count > 0)
- {
- SatirEkle(tablo, new System.Collections.Generic.List<object>
- {
- tablo2.Columns[0].ColumnName,
- tablo2.Columns[1].ColumnName,
- tablo2.Columns[2].ColumnName,
- tablo2.Columns[3].ColumnName
- });
- }
- foreach (DataRow satir in tablo2.Rows)
- {
- SatirEkle(tablo, new System.Collections.Generic.List<object>
- {
- satir[0].ToString(),
- satir[1].ToString(),
- satir[2].ToString(),
- satir[3].ToString()
- });
- }
- this.Controls.Add(tablo);
- }
- }
- }
Şimdi Duyurular isminde bir Announcement oluşturalım ve içine kayıt ekleyelim.
Şimdi bunu denemek için yeni bir sayfa ekleyelim.
Sayfa düzenleme ekranında Insert -> Web Part -> Custom -> WebPart_SPSiteDataQuery’i sayfamıza ekleyelim.
Sayfamızı kaydedelim.
Şimdi sayfamızı çalıştıralım ve kodumuzun çalışıp çalışmadığını inceleyelim.
Veysel Uğur KIZMAZ