Perşembe, Eylül 06, 2012

SharePoint'te Person/Group (Kişi/Grup) Tipindeki Sütunları Sorgulama

SharePoint üzerinde geliştirme yaptığımızda bir listeyi sorgularken sizlerin de bildiği gibi CAML kullanıyoruz. CAML Query Builder aracı gibi yardımcı araçlar ile oluşturduğumuz CAML'ları C# kodumuzun içerisinde kullanıp parametrik değerler ile dinamik sorgular kullanabiliyoruz. Metin, Sayısal değer ya da Tarih gibi sütun tiplerini rahatlıkla sorunsuz bir şekilde kullandığımız CAML'da Kişi/Grup tipi gibi sütunlarda problem yaşabiliyoruz.Bu sorun veri tipinin görüntüleme özelliğinin arka planda saklanan datadan farklı olmasından kaynaklanmaktadır.

Bir tane Task listesini sorgulayıp oturum açan kişiye atanan görevleri listeleyeceğimiz bir WebPart yazalım. WebPart'ı yazarken proje açma, web part oluşturma ve UserControl tarafına bir tane Literal kontrolü ekleme adımlarını pas geçiyorum. Arka planda data sorgulamak için CAML Query Builder ile bir CAML oluşturalım çıktı aşağıdaki gibi olacaktır.

<Query>
   <Where>
      <Eq>
         <FieldRef Name='AssignedTo' />
         <Value Type='User'>burak</Value>
      </Eq>
   </Where>
</Query>


Gördüğünüz gibi direkt sütun tipi olarak User alında ve burak kullanıcı adına eşit olanlar sorgulanmaya çalışıyor. Sorguyu program üzerinden test ettiğimde doğal olaral bir şey gelmedi çünkü Task listesi AssignedTo sütununda varsayılan olarak DisplayName'i alıyor. Herkesin DisplayName'i değişken bir yapıya sahip olduğu için bu şekilde bir yöntem kullanmak çok sağlıklı olmayacaktır. Bu sebeple kullanıcının site üzerindeki ID'si üzerinden ilerlenebilir. Bu yöntemde ilk olarak kullanıcı sorgulanıp SPUser nesnesine atılıyor ve ardından da CAML'da yapılan ufak bir değişiklik ile kullanıcının ID ile sorgulanacağı belirtilip parametre olarak da ID veriliyor. Sonuç olarak da tam istediğimiz görünümü elde edebiliyoruz, o an oturum açan kullanıcının görevlerini kendisine görüntüleyebiliyoruz. Kodları aşağıdan inceleyebilirsiniz:

 
SPWeb web = SPContext.Current.Web; //Web'i alalım.
SPList gorevler=web.Lists["Tasks"]; //Sorgulayacağımız listesi alalım.
SPUser user = web.EnsureUser(SPContext.Current.Web.CurrentUser.LoginName); //Kullanıcıyı elde edelim.
SPQuery query = new SPQuery(); //CAML'ı kullanmak için SPQuery nesnemizi oluşturalım.
query.Query = String.Format("<Where><Eq><FieldRef Name='AssignedTo' LookupId='TRUE' /><Value Type='Integer'>{0}</Value></Eq></Where>", user.ID); //CAML'ı oluşturup kullanıcının ID'sini belirtelim.
//Sonuçları ekrana basalım.
Literal1.Text = String.Empty;
foreach (SPListItem item in gorevler.GetItems(query))
{
    Literal1.Text += item.Title+"<br>";
}

Hiç yorum yok: