Bir önceki makalede FetchXML ile neler yapabileceğimize
değindik. (Buraya
tıklayarak o makaleye ulaşabilirsiniz) Eğer istersek FetchXML ile grouping
ve aggregate işlemlerini de yapabilmekteyiz. FetchXML ile aşağıdaki işlemler
desteklenmektedir;
·
sum
·
avg
·
min
·
max
·
count(*)
·
count(attribute name)
Aggregate yapabileceğimiz sorgu örneği standart olarak
bildiğimiz fetchXML kurgusundan farklı değil burada sadece attribute kısmında
aggregate ile ilgili keyword yer almakta. Aggregate=true diyerek bu şekilde bir
sorgulama yapacağımızı sisteme söylüyoruz. Sonrasında ise sırasıyla hangi alan
üzerinden işlem yapılacağını, alias yani etiketin ne olacağını ve aggregate
türümüzün ne olacağını sisteme söylüyoruz.
<fetch distinct='false' mapping='logical' aggregate='true'>
<entity name='opportunity'>
<attribute name='name' alias='opportunity_count' aggregate='count'/>
</entity>
</fetch>
Bu şekilde
oluşturduğumuz bir sorgu ile aslında şunu demek istiyoruz : “select count('name') as opportunity_count from
opportunity” yani standart bir count
işleminden fazlası değil yaptığımız.
Bu fetchXML’i
çalıştırmak için ise aşağıdaki gibi bir kod hazırladım;
string opportunity_count = @"
<fetch distinct='false' mapping='logical' aggregate='true'>
<entity name='opportunity'>
<attribute name='name' alias='opportunity_count'
aggregate='count'/>
</entity>
</fetch>";
EntityCollection opportunity_count_result =
ServiseBaglan().RetrieveMultiple(new FetchExpression(opportunity_count));
foreach (var c in opportunity_count_result.Entities)
{
Int32 aggregate2 = (Int32)((AliasedValue)c["opportunity_count"]).Value;
System.Console.WriteLine("Count of all opportunities: " + aggregate2);
}
Burada dikkat edilmesi
gereken nokta geriye EntityCollection döndürmesi. Bir önceki makalemden
hatırlarsanız normalde bu tarz sorgulama ile biz geriye account, contact gibi
sitem içerisindeki nesnelerden oluşmuş bir dizi alıyoruz. FetchXML yapısı
gereği tek bir metod kullanıyoruz ve bu metod sonucunda yukarıdaki örnekte
olduğu gibi tek bir satır dahi dönecek olsa bile yine sonucu bir collection
içerisinde almaktayız. Bu nedenle mecbur foreach içerisinde dönüyoruz ya da
collection’un 0. üyesini alıyoruz. Ben örneğimde foreach ile collection içinde
döndüm ve gördüğünüz gibi değeri aldım.
Yine bir önceki
makalemde ileri düzey sorgular bölümünde anlattığım gibi eğer nesne üzerinden
direkt bir değer döndürmeyeceksek sonuç her zaman AliasedValue olarak gelmekte.
işte bu nedenden dolayı şu şekilde bir convert işlemi yapıyoruz;
Int32 aggregate2 = (Int32)((AliasedValue)c["opportunity_count"]).Value
Bu işlem sonucunda bu
koddan aşağıdaki gibi çıktımızı alabiliyoruz.

Eğer distinct yapmak
istersek de fetchXML içerisine yerleştireceğimiz bir distinct=”true” ifadesiyle
ile sisteme bunu beliretebiliriz.
Aşağıda ise distinct
yapılmış bir kod örneği bulunmakta;
<fetch distinct='false' mapping='logical' aggregate='true'>
<entity name='opportunity'>
<attribute name='name' alias='opportunity_distcount' aggregate='countcolumn' distinct='true'/>
</entity>
</fetch>
Bu FetxhXML’i de
aşağıdaki kodla çalıştırabiliriz.
string opportunity_distcount = @"
<fetch distinct='false' mapping='logical' aggregate='true'>
<entity name='opportunity'>
<attribute name='name' alias='opportunity_distcount'
aggregate='countcolumn' distinct='true'/>
</entity>
</fetch>";
EntityCollection opportunity_distcount_result =
ServiseBaglan().RetrieveMultiple(new FetchExpression(opportunity_distcount));
foreach (var c in opportunity_distcount_result.Entities)
{
Int32 aggregate4 = (Int32)((AliasedValue)c["opportunity_distcount"]).Value;
System.Console.WriteLine("Distinct name count of all opportunities: " + aggregate4);
}
Console.ReadLine();
Bu kod sonucunda da
aşağıdaki gibi bir cevap alabiliriz sistemden;

Gelin olayı biraz
renklendirelim. Bu sefer de bir sorgu içerisinde birden fazla aggregate
seçeneğinin cevabını isteyelim. Böyle bir işlem için standart fetchXML’in
içerisinde sırasıyla hangi özelliklerin bize geri döneceğini belirtiyoruz tabii
unutulmaması gereken nokta ise hepsi için ayrı birer alias olması gerektiğidir.
<fetch distinct='false' mapping='logical' aggregate='true'>
<entity name='opportunity'>
<attribute name='opportunityid' alias='opportunity_count' aggregate='count'/>
<attribute name='estimatedvalue' alias='estimatedvalue_sum' aggregate='sum'/>
<attribute name='estimatedvalue' alias='estimatedvalue_avg' aggregate='avg'/>
</entity>
</fetch>
Bu sorgu için ise
aşağıdaki kodu hazırladım;
string estimatedvalue_avg2 = @"
<fetch
distinct='false' mapping='logical' aggregate='true'>
<entity name='opportunity'>
<attribute name='opportunityid' alias='opportunity_count'
aggregate='count'/>
<attribute name='estimatedvalue' alias='estimatedvalue_sum'
aggregate='sum'/>
<attribute name='estimatedvalue' alias='estimatedvalue_avg'
aggregate='avg'/>
</entity>
</fetch>";
EntityCollection estimatedvalue_avg2_result =
ServiseBaglan().RetrieveMultiple(new FetchExpression(estimatedvalue_avg2));
foreach (var c in estimatedvalue_avg2_result.Entities)
{
Int32 aggregate8a = (Int32)((AliasedValue)c["opportunity_count"]).Value;
System.Console.WriteLine("Count of all opportunities: " + aggregate8a);
decimal aggregate8b = ((Money)((AliasedValue)c["estimatedvalue_sum"]).Value).Value;
System.Console.WriteLine("Sum of
estimated value of all opportunities: " +
aggregate8b);
decimal aggregate8c = ((Money)((AliasedValue)c["estimatedvalue_avg"]).Value).Value;
System.Console.WriteLine("Average of estimated value of all opportunities:
" + aggregate8c);
}
Console.ReadLine();
İşte bu şekilde aynı
anda count, sum ve avg işlemlerini yapabilmekteyim. Sonuç ise aşağıdaki gibi;

Bu iki makalede FetchXML’ler üzerinde konuştuk. Umarım
faydalı olmuştur.