2013-12-10 9 views
24

Ich kann nicht scheinen, Dokumentation oder Beispiele für mein Problem zu finden (eine Weile jetzt gesucht). Ich denke, mein Problem ist ziemlich einfach, also hier geht es.Einfache innere Verbindung Ergebnis mit Dapper?

Ich habe zwei Tabellen. Meine primäre Tabelle heißt Personen und die sekundäre Tabelle ist PersonEntries. Für jede Person in der Personentabelle kann ich 0 oder mehr Einträge in der PersonEntries-Tabelle haben. So was.

Table: Person 
Id 
Name 

Table: PersonEntry 
PersonId 
CheckinTime 
CheckoutTime 

Ich habe zwei Objekte wie diese

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

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

Wenn ich es aus der Datenbank in meinen C# -Klassen zu erhalten war, wie würde ich es tun? Ich kann eine einzelne Tabelle in meine C# -Klasse zuordnen und dies für jede Tabelle tun, aber dann muss ich die Einträge zuordnen, die zu welcher Person gehören.

Ich habe mehrere Beispiele der Zuordnung ONE PersonEntry zu einer Person gesehen, das Problem hier ist, dass ich eine Null-zu-Viele-Beziehung habe. Meine Person hat eine LIST von PersonEntry Elemente.

Antwort

24

Sie können so etwas wie dies (siehe https://www.tritac.com/blog/dappernet-by-example) tun:

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

der letzte Parameter öffnet op für leistungsstarke Funktionen. Ich dachte nicht daran, es so zu lösen - ich hoffte auf ein nativeres Feature, aber das wird reichen. Vielen Dank :) –

Verwandte Themen