1
votes

Jointure interne de deux listes basées sur une liste enfant

J'ai deux listes de types différents d'objets personnalisés et j'essaye d'effectuer une jointure interne où les critères de jointure sont contenus dans une liste enfant des objets.

Voici un exemple de mes objets:

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

Et voici un exemple des données avec lesquelles je travaille:

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)
};

Je suis essayer de sélectionner tous les Container dans List qui ont une Reference correspondante dans le List code > basé sur Reference.Id . Avec ces données, je m'attends à ce que seul le deuxième élément de la List soit sélectionné.

S'il s'agissait d'une syntaxe valide, je chercherais à faire quelque chose le long du lignes de:

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;
    }
}

Comment cela peut-il être fait? Merci


Désolé pour le mauvais titre. J'ai du mal à mettre ce scénario en un petit groupe de mots - veuillez suggérer une modification si vous pouvez penser à quelque chose de plus approprié. Merci


1 commentaires

puis-je recommander d'utiliser une classe héritée pour la liste qui implémente iequatable ... alors vous pouvez utiliser sequence equals pour vérifier si une liste donnée correspond à votre liste ... voir ceci pour plus de détails - docs.microsoft.com/en-us/ dotnet / api /…


3 Réponses :


1
votes
containers.Where(c => c.Refs.Select(r => r.Id).Intersect(references.Select(r => r.Id)).Any());

0 commentaires

0
votes

J'utiliserais:

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

Aucune jointure n'est nécessaire.


0 commentaires

1
votes

une jointure interne n'est pas nécessaire ici, il vaut mieux s'en passer:

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

ou si vous voulez que l'ensemble des identifiants soit égal, utilisez SequenceEqual code>:

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


0 commentaires