[Résolu]Linq résultat sur 2 collections

Linq résultat sur 2 collections [Résolu] - C#/.NET managed - Programmation

Marsh Posté le 11-07-2011 à 17:45:07    

Bonjour à tous,
 
je suis confronté à un problème depuis un certain temps déjà et ne trouvant pas la solution, je m'en remet à vous.
 
j'ai un système de recherche nécessitant une jointure sur 2 collections :  
 
ma première collection

Code :
  1. public class ItemRequest
  2.     {
  3.         public List<string> Categorie { get; set; }
  4.         public List<Utilisation> Destination { get; set; }
  5.         public List<int> Upec { get; set; }
  6.         public ItemRequest()
  7.         {
  8.             Categorie = new List<string>();
  9.             Destination = new List<Utilisation>();
  10.             Upec = new List<int>();
  11.         }
  12.     }


 
ma deuxième collection est issue d'une requête et contient des objets de type Utilisation tel que

Code :
  1. var uses = from p in t.PRODUIT
  2.                select p.UTILISATION


 
seulement quand je croise le contenu de mes 2 collections, j'obtiens soit un problème de typage que je ne peux résoudre par un cast, soit j'ai un problème sur un contains() ...
 
ex :  

Code :
  1. if (itemRequest.Destination != null && itemRequest.Destination.Count > 0)
  2. {
  3. var matches = (from _u in t.M_UTILISATION
  4.                 join _p in t.PRODUIT on _u.ID equals _p.M_UTILISATION.Select(_x => _x.ID)
  5.                 where itemRequest.Destination.Contains(_u.ID)
  6.                 select _p);
  7. }


ici un Cannot resolve method join (blablabla...) problème de typage....
 

Code :
  1. var temp = (from _p in t.PRODUIT
  2.                  where (from _u in itemRequest.Destination select _u).Contains(_p.M_UTILISATION.Select(_x=>_x.ID))
  3.                  select _p);
  4. matches.Intersect(temp);


et la j'ai une ambigous invocation (blablabla...).
 
les objets contenus dans itemRequest.Destination et dans M_UTILISATION sont de même type.
 
Si quelqu'un à l'immense gentillesse de m'avancer un début de solution...
 
Merci par avance
 
niko


Message édité par niko59480 le 13-07-2011 à 11:21:11
Reply

Marsh Posté le 11-07-2011 à 17:45:07   

Reply

Marsh Posté le 12-07-2011 à 09:36:54    

Bonjour, tout d'abord merci de ta réponse fred :)
 
le problème avec le equals, c'est que j'ai besoin d'utiliser une liste comme pour un IN en SQL
 
mosso grodo en SQL ça donnerai un truc du genre :  

Code :
  1. SELECT p.* FROM dbo.PRODUIT AS p
  2. JOIN dbo.M_UTILISATION AS u ON u.ID IN p.M_UTILISATION -- liste de ID à ressortir
  3. WHERE u.ID IN itemRequest.Destination -- et chopper l'ID de chaque item de cette collection


 
bien sûr cette requête ne fonctionnerait pas telle quel, mais c'est pour donner un aperçu de ce que je voudrai faire


Message édité par niko59480 le 12-07-2011 à 09:46:18
Reply

Marsh Posté le 12-07-2011 à 10:38:01    

je ne peux pas faire comme ça car mon _p.M_UTILISATION est une collection et _p ne contient pas d'attribut UtilisationId.  
Je dois donc ressortir les ID de ma collection _p.M_UTILISATION
 
en gros je dois obtenir des t.PRODUIT pour lesquels les M_UTILISATION (collection) sont contenus (au moins un) dans itemRequest.Destination (collection).
je ne sais pas si c'est très clair... :s

Reply

Marsh Posté le 12-07-2011 à 15:12:40    

Suis pas sûr d'avoir absolument saisi, ni si ça passe en linq2entities(2ème requête), mais je verrais un truc du genre
 

Code :
  1. int[] listUtilisationsId = itemRequest.Destination.Select(m => m.Id).Distinct().ToArray();//je ne sais pas si tu as besoin du distinct
  2. var result = t.PRODUIT.Where(p = > p.M_UTILISATION.Any(u => listUtilisationsId.Contains(u.Id));


 
Edith : et version tout en un bien illisible

Code :
  1. var result = p.PRODUIT.Where(p => p.M_UTILISATION.Any(u => itemRequest.Destination.Select(m => m.Id).Distinct().ToArray().Contains(u.Id));


 
Si c'est pas magnifique :love:


Message édité par deliriumtremens le 12-07-2011 à 15:54:44
Reply

Marsh Posté le 13-07-2011 à 11:19:24    

Bonjour,
 
Merci pour ta réponse, j'ai trouvé une solution ressemblante légèrement plus concise :  

Code :
  1. var options = itemRequest.Destination.ToArray();
  2. var resultat = t.M_UTILISATION.Where(u => options.Contains(u.ID)).SelectMany(p => p.PRODUIT).Distinct();


 
Je ne connaissais pas le SelectMany mais celui-ci permettant de retourner un objet d'une collection, il convient exactement à mon problème.
 
Merci encore pour votre participation!
 
Niko


Message édité par niko59480 le 13-07-2011 à 11:19:58
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed