2

次のサンプル クラスがあるとします。

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 つの質問:

  1. 上記のパターンは、ValueInjector を使用して のコレクションをOrderのコレクションに平坦化する正しい/効果的な使用法LineItemですか? そうでない場合、代替手段は何ですか?(ValueInjector 拡張メソッドを使用せず、単一の for each ループを使用して、Header と OrderItem の両方をフラット化された LineItem に挿入する以外)
  2. AutoMapper を使用する場合に相当するものはありますか?
4

0 に答える 0