2013-12-10 12 views
24

Non riesco a trovare documentazione o esempi per il mio problema (ho cercato per un po 'ora). Penso che il mio problema sia piuttosto semplice, quindi ecco qui.Risultato join interno semplice con Dapper?

Ho due tabelle. La mia tabella principale si chiama Persons e la tabella secondaria è PersonEntries. Per ogni persona nella tabella Persona, posso avere 0 o più voci nella tabella PersonEntries. Come questo.

Table: Person 
Id 
Name 

Table: PersonEntry 
PersonId 
CheckinTime 
CheckoutTime 

Ho due oggetti come questo

public class Person { 
    public string Name; 
    public List<PersonEntry> PersonEntries; 
} 

public class PersonEntry { 
    public DateTime CheckinTime; 
    public DateTime CheckoutTime; 
} 

se dovessi ottenere dal database nelle mie classi C# come potrei farlo? Posso mappare una singola tabella nella mia classe C# e farlo per ogni tabella, ma poi mi rimane che corrisponda a ciò che le voci mappano a quale persona.

Ho visto diversi esempi di mapping di ONE PersonEntry a ONE Person, il problema è che ho una relazione zero-to-many. La mia persona ha un ELENCO di oggetti PersonEntry.

risposta

24

si può fare qualcosa di simile (vedi https://www.tritac.com/blog/dappernet-by-example):

public class Shop { 
    public int? Id {get;set;} 
    public string Name {get;set;} 
    public string Url {get;set;} 
    public IList<Account> Accounts {get;set;} 
} 

public class Account { 
    public int? Id {get;set;} 
    public string Name {get;set;} 
    public string Address {get;set;} 
    public string Country {get;set;} 
    public int ShopId {get;set;} 
} 

var lookup = new Dictionary<int, Shop>() 
conn.Query<Shop, Account, Shop>(@" 
       SELECT s.*, a.* 
       FROM Shop s 
       INNER JOIN Account a ON s.ShopId = a.ShopId      
       ", (s, a) => { 
        Shop shop; 
        if (!lookup.TryGetValue(s.Id, out shop)) { 
         lookup.Add(s.Id, shop = s); 
        } 
        if (shop.Accounts == null) 
         shop.Accounts = new List<Account>(); 
        shop.Accounts.Add(a); 
        return shop; 
       } 
       ).AsQueryable(); 
var resultList = lookup.Values; 
+0

l'ultimo parametro apre op per le caratteristiche potenti. Non pensavo di risolverlo in quel modo - speravo in una caratteristica più simile a quella nativa, ma così sarà. Grazie :) –