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
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
3 Réponses :
containers.Where(c => c.Refs.Select(r => r.Id).Intersect(references.Select(r => r.Id)).Any());
J'utiliserais:
var query = from c in containers where c.Refs.SequenceEqual(references) select c;
Aucune jointure n'est nécessaire.
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)));
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 /…