Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1757 connectés 

  FORUM HardWare.fr
  Programmation
  C#/.NET managed

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

 



 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

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

n°2088743
niko59480
O_o'
Posté le 11-07-2011 à 17:45:07  profilanswer
 

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
mood
Publicité
Posté le 11-07-2011 à 17:45:07  profilanswer
 

n°2088859
niko59480
O_o'
Posté le 12-07-2011 à 09:36:54  profilanswer
 

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
n°2088874
niko59480
O_o'
Posté le 12-07-2011 à 10:38:01  profilanswer
 

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

n°2088961
deliriumtr​emens
sic transit intestinal...
Posté le 12-07-2011 à 15:12:40  profilanswer
 

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
n°2089189
niko59480
O_o'
Posté le 13-07-2011 à 11:19:24  profilanswer
 

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

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C#/.NET managed

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

 

Sujets relatifs
[SQL] Resultat requete dans une variablefusionner le résultat de deux requêtes MySQL [Résolu]
[ACCESS]Affichage du résultat d'une requête sql en plusieurs colonnesAffichage du résultat d'une requête sql en plusieurs colonnes
Fscanf, pas de stockage de résultatSQL afficher le résultat avec plus de decimales
[php] Envoyer resultat requete plusieurs ligne par mailMettre le résultat en hypertexte
Mettre résultat d'un fichier php externe dans une variableBesoin d'aide concernant résultat suivi de colis
Plus de sujets relatifs à : [Résolu]Linq résultat sur 2 collections


Copyright © 1997-2018 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR