选择包含特定子元素的对象

时间:2017-06-02 00:22:09

标签: c# linq

我有以下课程。

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的集合。

4 个答案:

答案 0 :(得分: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) ))

您可以根据需要组合子查询中的所有/任何/包含

答案 1 :(得分:1)

IEnumerable<int> test = ...;
bins.Where(x => !test.Except(x.Components.Select(c => c.ComponentId)).Any());

答案 2 :(得分: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)));

答案 3 :(得分: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)

这些条件包含至少一个组件ID。如果要包含所有组件ID,可以使用All方法而不是Any