私は1つのテーブルを持っていますが、2つのクラスのコンポジションとしてマップしたいと思います。
Id、Name、ExtraDataValue、ExtraDataDateというフィールドを持つCustomerテーブルがあるとします。
class Customer
{
public int Id {get;set;}
public string Name {get;set;}
public ExtraData Extra {get;set;}
}
class ExtraData
{
public int Value {get;set;}
public DateTime Date {get;set;}
}
これをクエリし、Customerオブジェクト内のExtraDataを埋める最も良い方法は何ですか?
編集:
私はXenoPuTtSの答えが最初のものを解決するが、これではうまくいきませんので、より複雑なシナリオに質問を拡張します。
今私はテーブルにアドレスを割り当てるに参加していると仮定します。 splitOnオプションは結果を分割してExtraDataを作成しますが、分割してAddressを作成することはできません。
私はsplitOnを使用して別の問題を参照してください。 Select *を安全に使用することはできません。なぜなら、より多くのフィールドを持つテーブルを変更する場合、分割フィールドを下部に移動することを常に覚えなければならないからです。または、Selectコマンドで常にすべてのフィールドを安全な順序で記述する必要があります。
splitOn: "Id、ExtraDataValue、Id"これは質問の最新の演出に答えるものだと思います。これで、住所への参加があり、顧客オブジェクトのアドレス部分に値が設定されます。
class Customer
{
public int Id {get;set;}
public int Name {get;set;}
public ExtraData Extra {get;set;}
public Address Address{get;set;}
}
class ExtraData
{
public int Value {get;set;}
public int Date {get;set;}
}
class Address {
public string line1{get;set;}
}
using (var conn = DatabaseService.CreateConnection())
{
var t = conn.Query<Customer, ExtraData, Address, Customer>(@"
select
c.cust_num as Id,
c.cust_name as Name,
c.ex_data1 as Value,
c.ex_date as Date,
a.*
from Customer c
join Address a on c.addressid = a.addressid
",
(cust, extra, address) =>
{
cust.Extra = extra;
cust.Address = address;
return cust;
},
splitOn:"Id, Value, Id");
return t;
}
私は自分のためにこれを見ていただけだった。これは私が思いついた、あなたのシナリオに変更されたものです。
class Customer
{
public int Id {get;set;}
public int Name {get;set;}
public ExtraData Extra {get;set;}
}
class ExtraData
{
public int Value {get;set;}
public int Date {get;set;}
}
using (var conn = DatabaseService.CreateConnection())
{
var t = conn.Query<Customer, ExtraData, Customer>(@"
select
cust_num as Id,
cust_name as Name,
ex_data1 as Value,
ex_date as Date
from Customer
",
(cust, extra) =>
{
cust.Extra = extra;
return cust;
},
splitOn: "Value");
return t;
}