Простой внутренний результат соединения с Dapper?

dapper

Вопрос

Кажется, я не могу найти документацию или примеры для моей проблемы (теперь вы искали какое-то время). Я думаю, что моя проблема довольно проста, так что здесь.

У меня две таблицы. Моя основная таблица называется Персоны, а вторичная таблица - PersonEntries. Для каждого человека в таблице Person я могу иметь 0 или более записей в таблице PersonEntries. Как это.

Table: Person
Id
Name

Table: PersonEntry
PersonId
CheckinTime
CheckoutTime

У меня есть два объекта:

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

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

Если бы я должен был получить его из базы данных в мои классы c #, как бы я это сделал? Я могу сопоставить одну таблицу со своим классом c # и сделать это для каждой таблицы, но тогда мне осталось сопоставить, какие записи сопоставляются с тем, что человек.

Я видел несколько примеров отображения ONE PersonEntry в ONE Person, проблема в том, что у меня отношение «нуль-ко-многим». У моего лица есть СПИСОК элементов PersonEntry.

Принятый ответ

Вы можете сделать что-то подобное (см. 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;


Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow
Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow