none
Dinamic Linq, List<object> Anonymous Dönüş Tipli Methot RRS feed

  • Genel Tartışma

  • Herkese selamlar,

    Asp.net web form ile geliştirdiğim projelerde veritabanı işlemlerini (ekle,listele,sil, güncelle) linq ile yapmaya çalışıyorum. Bu işlemleri gerekli sayfada yapmak yerine Bir sınıf içerisinde toparlamak istedim. Bunun için bir Helper sınıfı oluşturdum, bu sınıfın içerisine işlem yapacak metodları static olarak tanımladım. Örneğin

    public static void UrunEkle(string adi, string fiyat)
            {
                using (var context = new HYEntities())
                {
                    var yeniurun = new urun_tbl
                    {
                        adi = adi,
                        fiyat = fiyat
                    };
                    context.urun_tbl.Add(yeniurun);
                    context.SaveChanges();
                }
            }

    Yukarıdaki sınıfa istediğim yerden ulaşıp veri ekliyorum. Bu tip ekleme ve güncelleme işlemlerinde gayet basit ve kolay bir şekilde çalışıyor. Fakat listeleme işlerinde biraz sorun yaşıyorum. 

    Yine örnek vererek açıklamak gerekirse örneğin bir ürünü listelediğimde geriye List<urun_tbl> türünden dönüş yapan bir methot yazıyorum mükemmel çalışıyor. Ancak ürünler tablosunu listeleyip select new { c.adi} gibi bir içerik seçtiğimde bunun dönüş tipi artık bir urun_tbl olmadığı için sorun yaşıyorum. Bu sebeple metodun dönüş tipini dinamic ya da List<object> olarak döndürüyorum. Bu kezde dönen datayı bir datagrid e bağlarsan sorun yok ancak. Gelen değerden bir ögeye erişmek istediğimde sorun yaşıyorum. 

    Nasıl bir çözüm olabilir.

    Şimdiden teşekkür ederim.

    2 Ağustos 2018 Perşembe 12:06

Tüm Yanıtlar

  • public List<T> listele()

    yapısını kullanabilirsiniz.


    Sorunuzun yanıtı bu ise "Yanıt olarak işaretle"yerek siz de forumun işleyişine katkıda bulununuz...


    2 Ağustos 2018 Perşembe 12:10
  • public List<T> listele()

    yapısını kullanabilirsiniz.


    Sorunuzun yanıtı bu ise "Yanıt olarak işaretle"yerek siz de forumun işleyişine katkıda bulununuz...


    Deniyorum hemen. Bir liste gelecek ama ne olduğu belli değil gibi bir anlamı mı var?

    Edit: Maalesef yapamadım.

    Severity Code Description Project File Line Suppression State
    Error CS0246 The type or namespace name 'T' could not be found (are you missing a using directive or an assembly reference?)

    Örnek bir kullanım gösterebilirmisiniz?



    • Düzenleyen ahmkub 2 Ağustos 2018 Perşembe 12:20
    2 Ağustos 2018 Perşembe 12:15
  •         public List<T> GetList<T>(int mode = 0)
            {
                List<T> ret = new List<T>();
                if (mode == 0)
                    for (int i = 0; i < 10; i++)
                        ret.Add((T)Convert.ChangeType(i, typeof(T)));
                else if (mode == 1)
                    for (char i = 'a'; i < 'z'; i++)
                        ret.Add((T)Convert.ChangeType(i, typeof(T)));
                else
                    ret.Add(default(T));
                return (List<T>)Convert.ChangeType(ret, typeof(List<T>));
            }
    
            // Örnek kullanım formatı,
    
            private void button1_Click(object sender, EventArgs e)
            {
                label1.Text = GetList<int>(2)[0].ToString();
            }
    


    Sorunuzun yanıtı bu ise "Yanıt olarak işaretle"yerek siz de forumun işleyişine katkıda bulununuz...

    2 Ağustos 2018 Perşembe 13:43
  •         public List<T> GetList<T>(int mode = 0)
            {
                List<T> ret = new List<T>();
                if (mode == 0)
                    for (int i = 0; i < 10; i++)
                        ret.Add((T)Convert.ChangeType(i, typeof(T)));
                else if (mode == 1)
                    for (char i = 'a'; i < 'z'; i++)
                        ret.Add((T)Convert.ChangeType(i, typeof(T)));
                else
                    ret.Add(default(T));
                return (List<T>)Convert.ChangeType(ret, typeof(List<T>));
            }
    
            // Örnek kullanım formatı,
    
            private void button1_Click(object sender, EventArgs e)
            {
                label1.Text = GetList<int>(2)[0].ToString();
            }


    Sorunuzun yanıtı bu ise "Yanıt olarak işaretle"yerek siz de forumun işleyişine katkıda bulununuz...

    Maalesef hocam koddan birşey anlayamadım. 
    var squery = from c in context.uruntbl
                                 where c.id == 1
                                 select new
                                 {
                                     adi = c.adi,
                                     fiyat= c.fiyat
    
                                 };
    
    

    Metodun bu taz bir sorguyu geriye döndermesi gerekiyor. Gelen icerikten tolist()[0], first vs. take gibi işlem yapabilmek istiyorum.
    3 Ağustos 2018 Cuma 08:52
  •         public List<T> GetList<T>()
            {
                List<T> ret = from c in context.uruntbl
                              where c.id == 1
                              select new
                              {
                                  adi = c.adi,
                                  fiyat = c.fiyat
    
                              };
                return (List<T>)Convert.ChangeType(ret, typeof(List<T>));
            }
    
            // Örnek kullanım formatı,
    
            private void button1_Click(object sender, EventArgs e)
            {
                List<UrunSinifinizinAdi> urunler = GetList<UrunSinifinizinAdi>();
            }
    

    Sorunuzun yanıtı bu ise "Yanıt olarak işaretle"yerek siz de forumun işleyişine katkıda bulununuz...

    3 Ağustos 2018 Cuma 12:42
  • Zaten var olan bişeyi (DbSet) yenden yapmaya çalışıyorsunuz gibi geldi bana.

    context.tabloAdı.ToList().ToHede().ToHodo()....

    şeklinde kullanabiliyorsunuz zaen. O yaptığınız Helper classınız bile fazla olmuş.


    e-mail: onay[nokta]yalciner[at]hotmail[nokta]com

    3 Ağustos 2018 Cuma 14:17
    Moderatör
  •         public List<T> GetList<T>()
            {
                List<T> ret = from c in context.uruntbl
                              where c.id == 1
                              select new
                              {
                                  adi = c.adi,
                                  fiyat = c.fiyat
    
                              };
                return (List<T>)Convert.ChangeType(ret, typeof(List<T>));
            }
    
            // Örnek kullanım formatı,
    
            private void button1_Click(object sender, EventArgs e)
            {
                List<UrunSinifinizinAdi> urunler = GetList<UrunSinifinizinAdi>();
            }

    Sorunuzun yanıtı bu ise "Yanıt olarak işaretle"yerek siz de forumun işleyişine katkıda bulununuz...

    Hocam cevaplarınız için teşekkür ederim. Ancak çalışmadı bendeki kodu görmeniz için aşağıya çıkarıyorum.

    Helper sınıfı içindeki methot

    static public List<T> GetList<T>() { using (var context = new HYEntities()) { List<T> ret = (from c in context.uruntbl where c.id == 1 select new { adi = c.adi, fiyat = c.fiyat }).ToList(); return (List<T>)Convert.ChangeType(ret, typeof(List<T>)); } }


    Kullanırken
    
    List<uruntbl> urunler = Islemler.GetList<uruntbl>();


    Hata veren kısım aşağıdadır.

    List<T> ret = (from c in context.uruntbl where c.id == 1 select new { adi = c.adi, fiyat = c.fiyat }).ToList(); Tip uyuşmazlığı hatası veriyor. System.Collections.Generic.List<<anonymous type: string adi, string fiyat>>' to 'System.Collections.Generic.List<T>


    Sanki sizin verdiğiniz bu metot da her halükarda geriye bir sınıf dönermek istiyor. Yani bir sınıf olsunda ne olursa olsun gibi.

    Bunu şu amaçla kullanabiliriz. Örneğin tüm tableler için bir GetUrunler(),GetKategori() gibi sınıflar yazmak yerine

    GetEntity() gibi bir sınıf yazarak listeleme işlemini tek bir methot ile yaptırabiliriz. Ancak benim istediğim gibi select new ile dönen anonim içeriklerde sanırım bu işimize yaramayacak.

    Tekrar teşekkür ederim. Başka bir öneriniz var mı?

    3 Ağustos 2018 Cuma 19:42
  • Sonuna .ToList() eklemişsiniz. Hata mesajını orada alıyorsunuz.

    Ben hem size ve hem de bu konuyu takip edenlere, geri dönüş tipini kullanım esnasında belirleyebileceğiniz bir fonksiyon hazırlamakla ilgili bir fikir vermeye çalıştım. Umarım bu konuda faydam olmuştur.

    Başarılar.


    Sorunuzun yanıtı bu ise "Yanıt olarak işaretle"yerek siz de forumun işleyişine katkıda bulununuz...


    3 Ağustos 2018 Cuma 20:18
  • Hocam maalesef sonuna tolist() eklememle alakası yok. tolist() olmadan da hata veriyor. hatta ben cast<> ile tip dönüşümü yaptım hatayı güya kaldırdım. Bu kezde haliyle runtime de hata verdi.

    Sizin sınıf bahsettiğiniz gibi geri dönüş tipini kullanım esnasında belirliyor. Ancak bu tip anonymous bir tip olamıyor. Yine önceden modellenmiş bir tip olması gerek.

    Tabi ki faydanız oldu sayenizde list<T> yi öğrenmiş oldum. Bu cepte lazım olursa kullanılabilir. Hatta şuanda listeleme sınıfını bu şekilde yapacağım. 

    Ama ben hala sorumun cevabını arıyorum. 


    4 Ağustos 2018 Cumartesi 08:33