1
votes

LINQ Many-to-Many sur des identificateurs imbriqués complexes

Je suis sûr que cela a été répondu, mais pour la vie de moi je ne peux pas le trouver.

J'ai trois entités:

Customer.Vendors = Customer.Vendors
  .Where(v => v.id *any matches to Distributor.Vendors.Any.id*).ToList()

Le problème intervient lorsque la seule méthode Repo dont je dispose obtient tous les clients de la base de données pour un distributeur. Cela signifie que la collection Distributors n'a pas seulement les fournisseurs qu'ils représentent, mais tous les fournisseurs qui travaillent avec ce client.

Ce que je dois faire est de filtrer la liste Customer.Vendors à seulement les fournisseurs qui correspondent à n'importe quel identifiant de la liste Distributor.Vendors .

Quelque chose comme ce qui suit:

class Customer
{
  string id;
  List<Vendor> vendors;
}

class Vendor
{
  string id;
}

class Distributor
{
  string id;
  List<Vendor> vendors;
  List<Customer> customers;
}


0 commentaires

3 Réponses :


1
votes

Pour la requête EF, vous pouvez essayer de sélectionner les identifiants de Distributor et d'utiliser Contains sur la collection résultante:

var distributorIds = d.Vendors.Select(dv => dv.Id).ToList();
Customer.Vendors = Customer.Vendors
  .Where(v => distributorIds.Contains(v.Id))
  .ToList();

Si c'est LINQ to objets, il est préférable de déplacer la collection ids vers la collection matérialisée (ou même HashSet ) dans une variable distincte:

Distributor d = ....;
Customer.Vendors = dbContext.Vendors
  .Where(v => d.Vendors.Select(dv => dv.Id).Contains(v.Id))
  .ToList();

Ou .Where ( v => Distributor.Vendors.Any (dv => dv.Id == v.Id)) .


0 commentaires

1
votes

Utiliser .Any () serait une solution simple. Aucun benchmark n'a été réalisé.

En supposant que vous ayez un objet Client c et un objet Distributor d

c.Vendors = c.Vendors
  .Where(v => d.Vendors.Any(cv => cv.Id == v.Id)).ToList()


0 commentaires

1
votes

Et pour:

var distribVendorIds = Distributors.Vendors.Select(v=>v.id);

Customer.Vendors = Customer.Vendors
  .Where(v => distribVendorIds.Any(t => t ==v.id)).ToList();


2 commentaires

.Any () prend un Func comme un paramètre ou sans aucun paramètre. je pense que cela ne compilera pas. docs.microsoft.com/ fr-fr / dotnet / api /…


C'est ce qui se passe lorsque vous répondez à un message sur un iPhone! J'ai modifié ma réponse