0

ネストされたクラス階層があります

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;

namespace Models
{
public class Document
{
public Document();
public Guid ID { get; set; }
public List<Order> Orders {get; set;}
}
public class Order
{
public Order();
public Guid ID { get; set; }
public List<OrderItem> OrderItems {get; set;}
}
public class OrderItem
{
public OrderItem();
public Guid ID { get; set; }
public String ProductName { get; set; }
public int Qty { get; set; }
}
} 

IDはGUIDです。指定されたGUIDを持つオブジェクトを一般的に検索する必要があります。1つのアプローチは、このためのクラスに対するインターフェースを指定することであるとアドバイスされています(SO質問を参照)。ただし、クラスが生成されるため、クラスを変更しない方が好きです。そこで、LINQtoObjectsを使用したアプローチを調査したいと思います。また、このアプローチに関するこの優れたSO投稿を見つけました:LINQ to Objects SO投稿ですが、もちろん、クエリですべての子クラスを指定する必要があります。

楽観的には、「GUIDがxのオブジェクトを取得する」ことを望んでいました。GUIDは一意であるため、経路を指定する必要はないと感じました。ただし、これはLINQでは不可能だと思います???

編集:上記のコードを更新しました。謝罪。GUID=XのOrderItemを抽出したい

4

2 に答える 2

1

OrderItem質問を変更すると、ドキュメントのリスト内で一致するすべてのオブジェクトを検索するコードは次のようになります。

List<Document> data = ...;
Guid guidToSearch = ...;
var orderItems = data.SelectMany(o => o.Orders)
                     .SelectMany(o => o.OrderItems)
                     .Where(o => o.ID == guidToSearch)
                     .ToList();

リストではなくドキュメントが1つしかない場合は、最初のSelectMany呼び出しをスキップできます。

于 2012-12-05T16:10:30.323 に答える
0

次のようなさまざまなオブジェクトのコレクションがあると仮定します。

List<object> data = new List<object>() { new Order { ID = ... }, new Document { ID = ... } };

次に、このようなコードを書くことができます

var guidToSearch = ...;
var results = data.Where<dynamic>(o => o.ID == guidToSearch).ToList();

これでresults、コレクションに一致するオブジェクトが含まれるようになります。

于 2012-12-05T16:07:57.353 に答える