2011-05-27 22 views
15

Bir araya getirdiğimiz bir dizi nesneye sahip olduğumu söyleyelim. Dapper kullanılarakDapper kullanarak bir toplama nesnesini verimli bir şekilde nasıl seçerim?

public class C{ 
public string Details {get;set;} 
} 

public class B{ 
    public string Details {get;set;} 
    public List<C> Items {get;set;} 
} 

public class A{ 
    public long ID {get;set;} 
    public string Details {get;set;} 
    public List<B> Items {get;set;} 
} 

, bir veritabanında tablolarından bu doldurmak için en iyi yolu nedir (benim durumumda bu postgres var ama bu önemli olmamalıdır). Örnekdeki tablolar nesne modeliyle bire birdir. Her bir bağımlı nesneye yabancı anahtar ilişkilerini temsil eden sınıftaki Öğeler özelliği. yani 3 tablolar, A'dan B'ye olan birçok ilişkiye One, B benim nesneleri de bütün çocuklarının verileri istediğiniz A'nın belirli bir kimlik için C

Yani

ile One Birçok ilişkisi vardır vardır.

En iyi tahminle ben bir şekilde QueryMultiple kullanmalıdır ama bunu en iyi nasıl emin değilim olmasıdır.

+0

Belki 'QueryMultiple' yöntemi? Ben 'dapper-dot-net' ile ilgili olduğunu düşündüğünüz varsayılarak davis'i indirdim. – IAbstract

+0

yep dapper-dot-net denediğim şey. – Peter

+0

Şu anda yapmakta olduğum şey, tüm farklı tablolar üzerinde bir QueryMultiple ve daha sonra çocuk koleksiyonlarına id olarak atamak için linq kullanmasıdır. ben veritabanına bir toplu yapmak ve ... Sonuçtan oldukça mutluyum ziyade ben db'den arızi sorgu bir kulübe yük olduğu yapmak Linq2SQL gördüklerimi daha ram tüm işi yapmak demektir Sadece benim yaklaşımımın dapper yazarının amacı olup olmadığını merak ettim. – Peter

cevap

11

Buraya teklif yardımcı düşünüyorum: Multi-Mapper to create object hierarchy yardımcı olabilir.

var mapped = cnn.QueryMultiple(sql) 
    .Map<A,B,A> 
    (
     A => A.ID, 
     B => B.AID, 
     a, bees => { A.Items = bees}; 
    ); 

Eğer GridReader uzatmak ve bir Haritacıyla varsayarsak: Bir 3 seviyeli hiyerarşi ile çalışmak için bu modeli genişletmek olabilir

public static IEnumerable<TFirst> Map<TFirst, TSecond, TKey> 
    (
    this GridReader reader, 
    Func<TFirst, TKey> firstKey, 
    Func<TSecond, TKey> secondKey, 
    Action<TFirst, IEnumerable<TSecond>> addChildren 
    ) 
{ 
    var first = reader.Read<TFirst>().ToList(); 
    var childMap = reader 
     .Read<TSecond>() 
     .GroupBy(s => secondKey(s)) 
     .ToDictionary(g => g.Key, g => g.AsEnumerable()); 

    foreach (var item in first) 
    { 
     IEnumerable<TSecond> children; 
     if(childMap.TryGetValue(firstKey(item), out children)) 
     { 
      addChildren(item,children); 
     } 
    } 

    return first; 
} 

.

+0

Bu güzel bir çözümdür, teşekkürler – Peter

+1

Bu benim için çalışmaz. TSecond okumayı denediğinde, okuyucu tükendi ve tekrar okunamıyor. –

+0

@Mr Grok - bende. Buna bir çözüm buldunuz mu? – BZink

İlgili konular