Risultato di join interno semplice con Dapper?

dapper

Domanda

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.

Ho due tavoli. 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 prenderlo dal database nelle mie classi c # come lo farei? 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 mappatura di ONE PersonEntry in ONE Person, il problema qui è che ho una relazione zero-to-many. La mia persona hanno un elenco di elementi PersonEntry.

Risposta accettata

Puoi fare qualcosa del genere (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;


Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow