web-dev-qa-db-fra.com

Résultat de jointure interne simple avec Dapper?

Je n'arrive pas à trouver de documentation ou d'exemples pour mon problème (recherche depuis un moment maintenant). Je pense que mon problème est assez simple, alors voilà.

J'ai deux tables. Ma table principale s'appelle Persons et la table secondaire est PersonEntries. Pour chaque personne dans la table Person, je peux avoir 0 ou plusieurs entrées dans la table PersonEntries. Comme ça.

Table: Person
Id
Name

Table: PersonEntry
PersonId
CheckinTime
CheckoutTime

J'ai deux objets comme ça

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

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

Si je devais le récupérer de la base de données dans mes classes c #, comment le ferais-je? Je peux mapper une seule table dans ma classe c # et le faire pour chaque table, mais il me reste ensuite à faire correspondre les entrées à quelle personne.

J'ai vu plusieurs exemples de mappage de ONE PersonEntry à ONE Person, le problème ici est que j'ai une relation de zéro à plusieurs. Ma personne possède une LISTE d'éléments PersonEntry.

33

Vous pouvez faire quelque chose comme ça (voir 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;
37
Jeroen K