Hüseyin Çelik Blog Sayfasi

.Net, Java, Android, Progress 4gl Paylasimlarim

XPO operatorlerinden ICustomFunctionOperator ve ICustomFunctionOperatorFormattable kullanimi

Bu yazimda, daha önce bir arkadasin sorusu üzerine yazmak istedigim ICustomFunctionOperator'ünü anlatmaya çalisacagim. Operatörleri where sorgulari hazirlamamiza yarayan nesneler olarak düsünebiliriz. XPO için olusturdugumuz nesnelere göre select, update, insert ve delete sorgulari hazirlanir. Tabi System.Reflection sinifi yardimiyla. Eger bu selectlere müdahale etmek istenirse linq kullanilmasi gerekiyor. Yani, XPO objedeki tüm alanlara (property) select çeker. NonPersistent ve PersistentAlias ile isaretlenmis alanlar disinda. Bu attiributelerden daha önce bahsetmistim. Iste bunun gibi tüm alanlara degilde sadece bir alana select çekmek istenirse yada bazi alanlar sadece belli durumlarda çekilsin istenirse linq kullanilmasi gerekiyor.

Örnek:

XPCollection<Ogrenci> ogrenciler1 = new XPCollection<Ogrenci>(XpoDefault.Session, CriteriaOperator.Parse(""), null);

var siniflar1 = from q in ogrenciler1
        select q.SinifKod;

Trace.Write(siniflar1.Count());

Birinci örnekte görüldügü gibi sadece SinifKod alani kullanilacak ama tüm alanlar dolduruluyor.

var siniflar2 = from q in new XPQuery<Ogrenci>(XpoDefault.Session)
	select q.SinifKod;

Trace.Write(siniflar2.Count());

Bu kodda sadece sinif kod alanina select çekildigi görülecektir. Select konusunu kapatmadan son bir konudan da bahsetmek istiyorum. DelayedAttribute var, bu nitelik büyük boyutlu alanlari ilk obje yüklendiginde degil sadece kullanildiginda yüklenmesi içindir.

Gelelim operatörlere:

Operatörler ise where kosulu yazarken kullanildigi gibi PersistentAlias attiribute ile de colculated field diyebilecegimiz propertyler olusturulabilir. Buna bir örnek vereyim.

[PersistentAlias("Custom('OgrenciAdresFonk', Telefon1, '0216')")]
public bool AnadolMu
{
    get
    {
        return Convert.ToBoolean(EvaluateAlias("AnadolMu"));
    }
}

Veritabaninda bu sekilde bir alan açilmaz. Bunun yerine OgrenciAdresFonk adindaki c# fonksiyonu çalistirilir. Where kosulunda nasil kullanildigina örnek vereyim.

XPCollection<Ogrenci> ogrenciler = new XPCollection<Ogrenci>(XpoDefault.Session, CriteriaOperator.Parse("Custom('OgrenciSehirFonk', Telefon1, '0212')"), null);

Fonksiyonun içerigine geçelim.

public class OgrenciSehirOperator : ICustomFunctionOperatorFormattable 
{
    public string Name
    {
        get
        {
            return "OgrenciSehirFonk";
        }
    }

    public object Evaluate(params object[] operands)
    {
        throw new NotImplementedException();
    }

    public Type ResultType(params Type[] operands)
    {
        return typeof(bool);
    }

    public OgrenciSehirOperator()
    {
    }

    public static void Register()
    {
        OgrenciSehirOperator instance = new OgrenciSehirOperator();
        if (CriteriaOperator.GetCustomFunction(instance.Name) == null)
        {
            CriteriaOperator.RegisterCustomFunction(instance);
        }
    }

    public string Format(Type providerType, params string[] operands)
    {
        if (providerType == typeof(SQLiteConnectionProvider))
            return string.Format("substr({0}, 1, 4) = {1}", operands[0], operands[1]);
        else if (providerType == typeof(MSSqlCEConnectionProvider))
            return string.Format("SUBSTRING({0}, 1, 4) = {1}", operands[0], operands[1]);
        else
            throw new Exception(":-(");
    }
}

Umarim anlasilmistir. Anlasilmadiysa iletisime geçebilirsiniz.

 



Loading