web-dev-qa-db-ja.com

Dapperとの単純な内部結合の結果?

私の問題に関するドキュメントや例が見つからないようです(しばらく検索中です)。私の問題は非常に簡単だと思うので、ここに行きます。

2つのテーブルがあります。私のプライマリテーブルはPersonsと呼ばれ、セカンダリテーブルはPersonEntriesです。 Personテーブルの各人物について、PersonEntriesテーブルに0個以上のエントリを含めることができます。このような。

Table: Person
Id
Name

Table: PersonEntry
PersonId
CheckinTime
CheckoutTime

このようなオブジェクトが2つあります

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

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

データベースからC#クラスに取得する場合、どうすればよいですか?単一のテーブルをc#クラスにマップし、各テーブルでそれを行うことができますが、その後、どのエントリがどの人にマップされるかを一致させる必要があります。

1つのPersonEntryを1つのPersonにマッピングする例をいくつか見てきましたが、ここでの問題は、0対多の関係があることです。私の個人には[〜#〜] list [〜#〜]の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;
37
Jeroen K