次のサンプル クラスがあるとします。
public class OrderHeader
{
public int OrderHeaderId { get; set; }
public string CustomerName { get; set; }
}
public class OrderItem
{
public int OrderHeaderId { get; set; }
public int OrderItemId { get; set; }
public string ProductName { get; set; }
public float Price { get; set; }
}
// Order contains the header information and a collection of items ordered
public class Order
{
public OrderHeader Header { get; set; }
public IEnumerable<OrderItem> Items { get; set; }
}
// LineItem is OrderHeader and OrderItem flattened out
public class LineItem
{
public int OrderHeaderId { get; set; }
public int OrderItemId { get; set; }
public string CustomerName { get; set; }
public string ProductName { get; set; }
public float Price { get; set; }
}
jgauffinの拡張メソッドを使用してValueInjector を拡張してコレクションを操作すると、次のように のコレクションがOrder
のコレクションにフラット化されますLineItem
。
var orders = new List<Order>();
var lineItems = new List<LineItem>();
// -extension method for collections with ValueInjector
// -project all the OrderItems into a single list
lineItems.InjectFrom( orders.SelectMany( x => x.Items ) );
// inject the header information into the flattened out LineItem objects
foreach( LineItem item in lineItems )
{
var order = orders.Single( x => x.Header.OrderHeaderId == item.OrderHeaderId );
item.InjectFrom( order.Header );
}
2 つの質問:
- 上記のパターンは、ValueInjector を使用して のコレクションを
Order
のコレクションに平坦化する正しい/効果的な使用法LineItem
ですか? そうでない場合、代替手段は何ですか?(ValueInjector 拡張メソッドを使用せず、単一の for each ループを使用して、Header と OrderItem の両方をフラット化された LineItem に挿入する以外) - AutoMapper を使用する場合に相当するものはありますか?