文書化された投稿/ユーザーの例によく似ているように見えるので、私はこれを少しいじっていますが、少し異なり、私にとってはうまくいきません.
次の単純化されたセットアップを想定しています (連絡先には複数の電話番号があります)。
public class Contact
{
public int ContactID { get; set; }
public string ContactName { get; set; }
public IEnumerable<Phone> Phones { get; set; }
}
public class Phone
{
public int PhoneId { get; set; }
public int ContactID { get; set; } // foreign key
public string Number { get; set; }
public string Type { get; set; }
public bool IsActive { get; set; }
}
複数の Phone オブジェクトを持つ Contact を返すものに行き着きたいと思っています。そうすれば、2 つの連絡先があり、それぞれに 2 つの電話がある場合、SQL はそれらの結合を合計 4 行の結果セットとして返します。次に、Dapper は、それぞれ 2 つの電話を持つ 2 つの連絡先オブジェクトをポップアウトします。
ストアド プロシージャ内の SQL は次のとおりです。
SELECT *
FROM Contacts
LEFT OUTER JOIN Phones ON Phones.ReferenceId=Contacts.ReferenceId
WHERE clientid=1
私はこれを試しましたが、4つのタプルになりました(これは問題ありませんが、私が望んでいたものではありません...結果を再正規化する必要があることを意味します):
var x = cn.Query<Contact, Phone, Tuple<Contact, Phone>>("sproc_Contacts_SelectByClient",
(co, ph) => Tuple.Create(co, ph),
splitOn: "PhoneId", param: p,
commandType: CommandType.StoredProcedure);
別の方法 (下記) を試すと、「'System.Int32' 型のオブジェクトを 'System.Collections.Generic.IEnumerable`1[Phone]' 型にキャストできません」という例外が発生します。
var x = cn.Query<Contact, IEnumerable<Phone>, Contact>("sproc_Contacts_SelectByClient",
(co, ph) => { co.Phones = ph; return co; },
splitOn: "PhoneId", param: p,
commandType: CommandType.StoredProcedure);
私は何か間違ったことをしているだけですか?投稿/所有者の例と同じように見えますが、子から親ではなく親から子に移動する点が異なります。
前もって感謝します