LINQ renvoie les éléments d’une liste qui correspondent à tous les noms (chaîne) d’une autre liste

J’ai 2 listes. 1 est une collection de produits. Et l’autre est une collection de produits dans un magasin.

Je dois pouvoir renvoyer tous les produits shopProducts si les noms correspondent aux noms figurant dans les produits.

J’ai ceci mais cela ne semble pas fonctionner. Des idées?

var products = shopProducts.Where(p => p.Name.Any(listOfProducts. Select(l => l.Name).ToList())).ToList(); 

Je dois dire que donnez-moi tous les produits dont le nom figure dans l’autre liste.

 var products = shopProducts.Where(p => listOfProducts.Any(l => p.Name == l.Name)) .ToList(); 

Pour LINQ-to-Objects, si listOfProducts contient de nombreux éléments, vous obtiendrez de meilleures performances si vous créez un HashSet contenant tous les noms requirejs, puis utilisez-le dans votre requête. HashSet présente des performances de recherche O (1) comparées à O (n) pour un IEnumerable arbitraire.

 var names = new HashSet(listOfProducts.Select(p => p.Name)); var products = shopProducts.Where(p => names.Contains(p.Name)) .ToList(); 

Pour LINQ-to-SQL, je m’attendrais (espérons-le) à ce que le fournisseur puisse optimiser automatiquement le code SQL généré sans avoir besoin d’ajustements manuels de la requête.

Vous pouvez utiliser une jointure, par exemple:

 var q = from sp in shopProducts join p in listOfProducts on sp.Name equals p.Name select sp; 

Un guide plus complet sur rejoindre est ici .

Vous pouvez créer un IEqualityComparer qui indique que les produits portant le même nom sont égaux.

 class ProductNameEqulity : IEqualityComparer { public bool Equals(Product p1, Product p2) { return p1.Name == p2.Name } public int GetHashCode(Product product) { return product.Name.GetHashCode(); } } 

Vous pouvez ensuite l’utiliser dans la méthode d’extension Intersect .

 var products = shopProducts.Intersect(listOfProducts, new ProductNameEquality()); 

Essayez ceci s’il vous plaît

 var products = shopProducts.Where(m=> listOfProducts.Select(l=>l.Name).ToList().Contains(m=>m.Name)); 
 var products = shopProducts .Where(shopProduct => listOfProducts.Any(p => shopProduct.Name == p.Name)) .ToList();