2017-06-02 19 views
0

私は以下のクラスを持っています。特定の子要素を含むオブジェクトを選択してください

public class Bin 
{ 
    public int BinId { get; set; } 
    public IEnumerable<Component> Components { get; set; } 
} 

public class Component 
{ 
    public int ComponentId { get; set; } 
    public string ComponentName { get; set; } 
} 

LINQを使用してどのように私は部品の特定のセットを含むすべてのBinオブジェクトを見つけるか、IDが1、2、3とコンポーネントが言いますか?

編集

ただ、すべてのIDがBinに存在していなければならない明確にします。また、一致するIDを含むコレクションがあります。このよう

答えて

1
var bins = new List<Bin>(); 
var ids = new List<int> { 1, 2, 3 }; 

// go through each bin and make sure it has all the items in ids 
bins.Where(x => ids.All(id => x.Components.Select(c => 
    c.ComponentId).Contains(id))); 
1

bins.Where(b => b.Components.Any(c => new[]{1,2,3}.Contains(c.ComponentId)) 

あなたはすべての必要な場合:

bins.Where(b => b.Components.All(c => new[]{1,2,3}.Any(i => i == c.ComponentId))) 

それとも、リスト内のいくつかの項目は、この項目を持っていることが必要な場合:

bins.Where(b => new[]{1,2,3}.All(i => b.Components.Any(c => i == c.ComponentId))) 

あなたは組み合わせることができますすべて/ any /は、サブクエリにあなたが望むように含まれます

+0

このAllメソッドを使用することができ、または3 –

+0

ありがとうございました。どのようにしてすべてのコンポーネントを含むビンを見つけることができますか? – erdinger

+0

私は答えを –

0
bins.Where(x => x.Components.Any(y => y.ComponentId ==1 || y.ComponentId == 2 || y.ComponentId == 3)) 

これを試してみてください。

整数のリストがある場合は、以下のように最後の条件を変更できます。

y => list.Any(z => y.ComponentId == z) 

またはこのようなものです。

y => list.Contains(y.ComponentId) 

これらの条件には、少なくとも1つのコンポーネントIDが含まれている必要があります。あなたはすべてのコンポーネントIDを含むようにしたい場合は、ID 1,2との少なくとも一つの成分が含まれているよりも、あなたはすべてのビンに一致する代わりにAny

1
IEnumerable<int> test = ...; 
bins.Where(x => !test.Except(x.Components.Select(c => c.ComponentId)).Any()); 
関連する問題