LINQ to SQL エンティティから派生した親オブジェクトと子オブジェクトがあります。これらをいくつかのドメインフレンドリーな DTO にマップしたいと考えています。私の SQL エンティティ クラスは次のようになります。
public class SqlEntityParent
{
public int ParentId { get; set; }
public string Name { get; set; }
public EntitySet<SqlEntityChild> Children { get; set; }
}
public class SqlEntityChild
{
public int ChildId { get; set; }
public int ParentId { get; set; }
public int Position { get; set; }
public string CategoryName { get; set; }
public string CategoryValue { get; set; }
}
SqlEntityParent
このモデルでは、との間の標準的な 1 対多の関係SqlEntityChild
です。いくつかの代表的なデータは...
親:
親 ID 名 -------- ------- 1 親 1
子:
ChildId ParentId 位置 CategoryName CategoryValue ------- -------- -------- ------------ ------------- 1 1 1 内容 モノ 2 1 1 グループ グループワン 3 1 2 内容 モノ 4 1 2 グループ グループツー
次に、これらのデータを次のようなドメイン オブジェクトにマップします。
public class DomainParent
{
public int ParentId { get; set; }
public string Name { get; set; }
public List<DomainChild> Children { get; set; }
}
public class DomainChild
{
public int Position { get; set; }
public string Contents { get; set; }
public string Group { get; set; }
}
この構造では、1 つのDomainChild
オブジェクトが 2 つのオブジェクトのデータで構成されSqlEntityChild
、グループ化はPosition
子エンティティの値によって決定されます。したがって、これらのサンプル データは、 2 つのオブジェクトDomainParent
のリストを持つ1 つのオブジェクトを表しDomainChild
ます。最初の子にはPosition
、1 のContents
値、"Things" のGroup
値、および "GroupOne" の値が必要です。2 番目の子にはPosition
、2 の 、Contents
「Things」の 、およびGroup
「GroupTwo」の が必要です。
ValueResolvers を使用して AutoMapper で 1 対 1 のカスタム マッピングを設定することに満足していますが、これを処理する最善の方法がわかりません。以下のリゾルバーと、1 回のパスで子エンティティのリスト全体をマップする親エンティティの関連付けられたマッピングを作成しましたが、このリゾルバー クラスで子オブジェクトのマッピング全体を手動で行う必要があるため、間抜けに思えます。
Mapper.CreateMap<SqlEntityParent, DomainParent>()
.ForMember(dto => dto.Children, opt => opt.ResolveUsing<MyResolver>());
public class MyResolver: ValueResolver<SqlEntityParent, List<DomainChild>>
{
private MyDataContext db;
public MyResolver()
{
db = new MyDataContext();
}
protected override List<DomainChild> ResolveCore(SqlEntityParent source)
{
// In here:
// 1. custom LINQ queries
// 2. manual creation of DomainChild objects
// 3. manual mapping of SqlEntityChild to DomainChild
}
}
ですから、私の主な質問は次のとおりです。これは、この状況で AutoMapper を使用して実行できる最善の方法ですか、それとも他に使用できるより効果的な方法はありますか?