ItemDataBound içinde dynamic ile nasıl veri bağlanır

Merhaba arkadaşlar bu makale karşılaştığım bir bug üzerine oluşmuştur.

Hata şu şekilde: 
ItemDataBound'ta RepeaterItemEventArgs e içinde name isimli DataItem gelmesine rağmen. DataBinder.Eval(e.item.DataItem,"name"); şeklinde veriye erişemiyor. Böyle bir kolon bulunmamaktadır diye uyarı veriyor.
Kolona ulaşamamasının sebebide LinQ sorgusunda alt tablodan gelen veriler tek bir satır olmasına rağmen EventArgs'a bir liste şeklinde geliyor olması
 

Entity Sorgum:

var cats = db.categories.Where(w => w.is_active == true).Select(s =>
                                new
                                {
                                    s.id,
                                    category_name = s.category_langs.FirstOrDefault(f => f.lang == "tr").name,
                                    category_products = s.products.Select(s2 => s2.product_langs.Where(w => w.lang == "tr").Select(s3 => new { s3.product_id, s3.name }))
 
                                }).ToList();

Üstteki sorguda kırmızı bölüm Kategori Repeater'ı içinde Ürün Repeater'ına bağlanıyor. Ürün Repeater'ı ItemDataBound'unda tek satır bir veri gelmesine rağmen EventArgs'ta 0'ıncı index üzerinden erişiliyor.  Ama 0'ıncı index görünmesine rağmen bir dizi bir liste gibi davranıp liste[0] şeklinde yine erişemiyor. 
Burda dynamic tipi devreye giriyor.


dynamic data = e.item.DataItem;

string name = data[0].name;
string id = data[0].product_id;

string herhangi_bir_degisken = data[0].herhangi_bir_degisken;

şeklinde artık değişkenlerime erişebildiğimi gördüm.

Not:
  • data[0].name; bu değişken intelisense'ta otomatik çıkmaz dinamik oluştuğu için. Siz yazın hata vermeyecektir. Zaten dynamic'in özellğide budur zaten.
  • Sorgunuzda direk gelen değişkenlere 0'ıncı index yerine direk data.category_name şeklinde erişebilirsiniz.(Entity Sorgusu)
  • Üstelik bu DataBinder.Eval(e.item.DataItem,"degiskenadi"); şeklinde yazmaktan daha kolay.