2016-11-28 10 views
2

foreachループを使用しないでネストしたオブジェクトから特定の値を取得する必要があります。私はここで正しいアプローチは、linqクエリだと思うが、私は必要な値をつかむことができません。入れ子オブジェクトから値を取得するLinqクエリ

public class Order 
{ 
    public int OrderID { get; set; } 
    public List<OrderItems> { get; set; } 
} 

public class OrderItems 
{ 
    public int OrderItemID { get; set; } 
    public string ItemName { get; set; } 
    public int Quantity { get; set; } 
    public List<OrderItemShipping> OrderItemShippings { get; set; } 
} 

public class OrderItemShipping 
{ 
    public int OrderItemShippingID { get; set; } 
    public Address ShipAddress { get; set; } 


public class Address 
{ 
    public int AddressID { get; set; } 
    public string FirstName { get; set; } 
    public string LastName { get; set; } 
    public string Address1 { get; set; } 
    public string City { get; set; } 
    public string State { get; set; } 
    public string PostalCode { get; set; } 
} 

私のような何かをできるようにしたい:クラス構造を考慮

var shipToAddress = Order.OrderItems.OrderItemShipping.FirstOrDefault(x => x.Address.Address1); 

しかし、私は、私は必要な値を取得することができないだから私の構文は、正しいあってはなりませんか?

+0

おそらく 'SelectMany'はあなたが探しているものですか? – DavidG

+1

注文クラスの 'List 'タイプのあなたのプロパティ名はどこですか? –

+0

x => x.Address.Address1 == "something"のようなlinqに何らかの操作をする必要があります –

答えて

2

あなたは(ネストされた)コレクションのアイテムSelectManyにアクセスする必要がある場合はあなたの友達です:

var shipToAddress = Order.OrderItems 
    .SelectMany(oi => oi.OrderItemShipping.Select(ois => ois.ShipAddress.Address1))) 
    .FirstOrDefault(); 

あなたの構文はFirstOrDefaultの過負荷が述語(boolを返すので、関数)を想定しているため間違っていたが、あなた合格:FirstOrDefault(x => x.Address.Address1)

何らかの理由でフィルタリングする必要がある場合(ネストされたオブジェクトの特定の値)、要件をより正確に説明する必要があります。

+0

ありがとう、これは私が必要としたものでした。 – PixelPaul

関連する問題