基于子列表的内部联接两个列表

时间:2019-01-03 14:17:31

标签: c# list linq join

我有两个不同类型的自定义对象列表,我正在尝试执行内部联接,其中联接条件包含在对象的子级列表中。

这是我的对象的一个​​示例:

public class Container
{
    public List<Reference> Refs;

    public Container(List<Reference> refs )
    {
        Refs = refs;
    }
}

public class Reference
{
    public int Id;

    public Reference(int id )
    {
        Id = id;
    }
}

这是我正在处理的数据的示例:

List<Container> containers = new List<Container>()
{
    new Container(new List<Reference>()
    {
        new Reference(1),
        new Reference(2),
        new Reference(3)
    }),

    new Container(new List<Reference>()
    {
        new Reference(4),
        new Reference(5),
        new Reference(6)
    })
};

List<Reference> references = new List<Reference>()
{
    new Reference(4),
    new Reference(5),
    new Reference(6)
};

我试图基于Container选择List<Container>Reference中具有匹配List<Reference>的所有Reference.Id。有了这些数据,我希望仅选择List<Container>中的第二项。

如果这是有效的语法,那么我将按照以下方式进行操作:

var query = from c in containers
            join r in references on c.Refs.Contains( r.Id )
            select c;

这怎么办?谢谢


对不起,标题不好。我正在努力将这种情况用简短的文字表述-如果您认为更合适的内容,请提出建议。谢谢

3 个答案:

答案 0 :(得分:1)

error[E0499]: cannot borrow `store` as mutable more than once at a time

答案 1 :(得分:1)

这里不需要内部联接,最好没有它:

containers.Where(c => c.Refs.Any(x => references.Any(e => x.Id == e.Id)));

或者如果您希望整个ID相等,则使用SequenceEqual

var sequence = references.Select(e => e.Id);
var result = containers.Where(c => c.Refs.Select(s => s.Id).SequenceEqual(sequence));

答案 2 :(得分:0)

我会使用:

var query = from c in containers where c.Refs.SequenceEqual(references)
                select c;

不需要加入。