Précédent   Forum des professionnels en informatique > Dotnet > Accès aux données > Linq
Linq Forum d'entraide sur la manipulation de données avec Linq
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 17/11/2011, 20h36   #1
Nouveau Membre du Club
 
Inscription : août 2008
Messages : 254
Détails du profil
Informations forums :
Inscription : août 2008
Messages : 254
Points : 35
Points : 35
Par défaut LINQ avec plusieurs clauses WHERE et C#

Bonjour,
Je dois récupérer les élements d'une Table en fonction d'une recherche effectuée dans une Vue. J'ai :
- une Table MesDonnees (avec les colonnes id, Titre, Description, Date, etc )
- une Vue MesDonneesVue (avec les colonnes id, TitreTraite, DescriptionTraitee)

Dans ma méthode C# j'ai en paramètre une liste de mots List<string> listeMots.
J'aimerais récupérer les éléments de la table MesDonnees contenant tous les mots de la liste listeMots, soit dans la colonne TitreTraite soit dans la colonne DescriptionTraitee.
Je n'arrive pas à écrire cette requête en LINQ to SQL
Si quelqu'un peut m'aider...
Merci beaucoup
Cedric
Cedric33 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/11/2011, 21h00   #2
Modérateur
 
Avatar de h2s84
 
Homme Holty Samba SOW
Développeur .NET
Inscription : mars 2007
Messages : 2 393
Détails du profil
Informations personnelles :
Nom : Homme Holty Samba SOW
Âge : 27
Localisation : Sénégal

Informations professionnelles :
Activité : Développeur .NET
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : mars 2007
Messages : 2 393
Points : 4 089
Points : 4 089
Envoyer un message via MSN à h2s84 Envoyer un message via Skype™ à h2s84
Salut,

Peut-on voir ce que t'as commencé à écrire au moins ?
__________________
Les FAQs sur les technologies .Net voir ici
Les cours et tutos sur les technologies .Net voir ici
Les critiques sur les livres parlant des technologies .Net voir ici
Pensez à la balise [CODE]
Pensez au tag si votre problème est résolu

While(!success) { TryAgain(); }
h2s84 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/11/2011, 22h14   #3
Membre Expert
 
Avatar de GuruuMeditation
 
Homme Olivier Matis
Software Architect
Inscription : octobre 2010
Messages : 767
Détails du profil
Informations personnelles :
Nom : Homme Olivier Matis
Âge : 37
Localisation : Belgique

Informations professionnelles :
Activité : Software Architect
Secteur : Conseil

Informations forums :
Inscription : octobre 2010
Messages : 767
Points : 1 577
Points : 1 577
Envoyer un message via MSN à GuruuMeditation
A vue de nez, je dirais quelque chose comme :
Code C# :
1
2
 
var result = MesDonnees .Where(s => ((listeMots.Count(l => s.TitreTraite .Contains(l)) == listeMots.Count) || (listeMots.Count(l => s.DescriptionTraitee.Contains(l)) == listeMots.Count));
__________________
Microsoft MVP : Visual C#

MCPD - Windows Developer 4
MCPD - Web Developer 4
MCTS - Silverlight 4, Development

“If debugging is the process of removing bugs, then programming must be the process of putting them in.”
(Edsger W. Dijkstra)
GuruuMeditation est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/11/2011, 22h33   #4
Nouveau Membre du Club
 
Inscription : août 2008
Messages : 254
Détails du profil
Informations forums :
Inscription : août 2008
Messages : 254
Points : 35
Points : 35
J'ai écrit ça. N'ayant pas réussi à le faire en une seule requête, j'ai voulu le faire en 2 mais ça ne marche pas non plus
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
 
var requeteRecherche = from maVue in _context.MesDonneesVue 
                                      select maVue 
foreach (string motCle in listeMots)
{
	requeteRecherche = requeteRecherche.Where(p => p.TitreTraite.Contains(motCle) || p.DescriptionTraitee.Contains(motCle));
}
 
var requeteResultat = from annonce in _context.MesDonnees 
                                  select annonce;
foreach (MesDonneesVue  mesDonneesVue  in requeteRecherche)
{
	requeteResultat = requeteResultat.Where(p => p.ID.Equals(mesDonneesVue .ID));
}
C'est au niveau de ce code
Code :
1
2
3
4
5
 
foreach (MesDonneesVue  mesDonneesVue  in requeteRecherche)
{
	requeteResultat = requeteResultat.Where(p => p.ID.Equals(mesDonneesVue .ID));
}
que ça donne un résultat faux.
Mais j'aimerais quand arriver à le faire en une seule fois.
Cedric33 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/11/2011, 22h36   #5
Nouveau Membre du Club
 
Inscription : août 2008
Messages : 254
Détails du profil
Informations forums :
Inscription : août 2008
Messages : 254
Points : 35
Points : 35
GuruuMeditation, ça ne peut pas marcher puisque qu'à aucun moment tu mentionnes MesDonneesVue
Cedric33 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/11/2011, 22h59   #6
Modérateur
 
Avatar de h2s84
 
Homme Holty Samba SOW
Développeur .NET
Inscription : mars 2007
Messages : 2 393
Détails du profil
Informations personnelles :
Nom : Homme Holty Samba SOW
Âge : 27
Localisation : Sénégal

Informations professionnelles :
Activité : Développeur .NET
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : mars 2007
Messages : 2 393
Points : 4 089
Points : 4 089
Envoyer un message via MSN à h2s84 Envoyer un message via Skype™ à h2s84
Déjà peut-on savoir ce qui différencie MesDonnees et MesDonneesVue ?
Une vue est toujours censée faciliter l'écriture des requêtes. Alors je trouve bizarre que tu ais besoin à la fois de MesDonnees et MesDonnesVue dans une seule et même requête. ça n'a aucun sens s'il se trouve que MesDonneesVue se base déjà sur MesDonnees.
__________________
Les FAQs sur les technologies .Net voir ici
Les cours et tutos sur les technologies .Net voir ici
Les critiques sur les livres parlant des technologies .Net voir ici
Pensez à la balise [CODE]
Pensez au tag si votre problème est résolu

While(!success) { TryAgain(); }
h2s84 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/11/2011, 23h11   #7
Nouveau Membre du Club
 
Inscription : août 2008
Messages : 254
Détails du profil
Informations forums :
Inscription : août 2008
Messages : 254
Points : 35
Points : 35
En fait MesDonneesVue est une vue qui se base sur la table MesDonnees. Les colonnes TitreTraite et DescriptionTraitee de la vue sont les colonnes Titre et Description de la table MesDonnees mais avec un traitement particulier, ce qui me permet de faire ma recherche.
Cedric33 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/11/2011, 23h19   #8
Nouveau Membre du Club
 
Inscription : août 2008
Messages : 254
Détails du profil
Informations forums :
Inscription : août 2008
Messages : 254
Points : 35
Points : 35
C'est vrai que tu as raison je pourrais créer une vue qui reprend toutes les colonnes de MesDonnees et avec les 2 colonnes en plus (TitreTraite et DescriptionTraitee)
Mais de toute façon ça arrive souvent qu'on ait besoin de faire ce genre de chose. J'aimerais quand même comprendre comment on fait
Cedric33 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/11/2011, 23h27   #9
Modérateur
 
Avatar de h2s84
 
Homme Holty Samba SOW
Développeur .NET
Inscription : mars 2007
Messages : 2 393
Détails du profil
Informations personnelles :
Nom : Homme Holty Samba SOW
Âge : 27
Localisation : Sénégal

Informations professionnelles :
Activité : Développeur .NET
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : mars 2007
Messages : 2 393
Points : 4 089
Points : 4 089
Envoyer un message via MSN à h2s84 Envoyer un message via Skype™ à h2s84
Citation:
Envoyé par Cedric33 Voir le message
C'est vrai que tu as raison je pourrais créer une vue qui reprend toutes les colonnes de MesDonnees et avec les 2 colonnes en plus (TitreTraite et DescriptionTraitee)
Mais de toute façon ça arrive souvent qu'on ait besoin de faire ce genre de chose. J'aimerais quand même comprendre comment on fait

Je suis POUR cette idée. Une fois que t'auras ta vue définie de cette façon je pense que tu pourras hérité ton entité MesDonneesVue à partir de ton entité MesDonnees. En Entity Framework je sais comment faire mais en Linq to SQL je n'ai jamais essayé mais une recherche sur Google devrait pouvoir te dire comment faire.
Si t'arrive à faire ce que j'ai dit alors ta requête devrait être du genre :
Code C# :
1
2
3
4
5
6
7
 
var requeteRecherche = from maVue in _context.MesDonneesVue 
                                 select maVue;
foreach (string motCle in listeMots)
{
	requeteRecherche = requeteRecherche.Where(p => p.TitreTraite.Contains(motCle) || p.DescriptionTraitee.Contains(motCle));
}

Test données héritant de MesDonnees alors rien t'empêche de faire le cast pour utiliser ce type d'objet.
__________________
Les FAQs sur les technologies .Net voir ici
Les cours et tutos sur les technologies .Net voir ici
Les critiques sur les livres parlant des technologies .Net voir ici
Pensez à la balise [CODE]
Pensez au tag si votre problème est résolu

While(!success) { TryAgain(); }
h2s84 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/11/2011, 23h43   #10
Nouveau Membre du Club
 
Inscription : août 2008
Messages : 254
Détails du profil
Informations forums :
Inscription : août 2008
Messages : 254
Points : 35
Points : 35
Je viens de tester. C'est vrai que c'est plus logique de faire comme ça mais j'ai un soucis car
Code :
1
2
3
4
5
 
foreach (string motCle in listeMots)
{
	requeteRecherche = requeteRecherche.Where(p => p.TitreTraite.Contains(motCle) || p.DescriptionTraitee.Contains(motCle));
}
ne tient compte que du dernier terme de listeMots
En fait si listeMots contient "Mot1" et "Mot2" alors la requête cherche les éléments contenant "Mots2" uniquement
Cedric33 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/11/2011, 23h51   #11
Modérateur
 
Avatar de h2s84
 
Homme Holty Samba SOW
Développeur .NET
Inscription : mars 2007
Messages : 2 393
Détails du profil
Informations personnelles :
Nom : Homme Holty Samba SOW
Âge : 27
Localisation : Sénégal

Informations professionnelles :
Activité : Développeur .NET
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : mars 2007
Messages : 2 393
Points : 4 089
Points : 4 089
Envoyer un message via MSN à h2s84 Envoyer un message via Skype™ à h2s84
Ce n'est pas logique vu que tu parcours toute la liste. Sinon question bête : regardes bien si ta liste contient vraiment le terme dont tu parles ?
__________________
Les FAQs sur les technologies .Net voir ici
Les cours et tutos sur les technologies .Net voir ici
Les critiques sur les livres parlant des technologies .Net voir ici
Pensez à la balise [CODE]
Pensez au tag si votre problème est résolu

While(!success) { TryAgain(); }
h2s84 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/11/2011, 23h57   #12
Nouveau Membre du Club
 
Inscription : août 2008
Messages : 254
Détails du profil
Informations forums :
Inscription : août 2008
Messages : 254
Points : 35
Points : 35
oui je viens de vérifier. En fait c'est comme si à chaque passage dans le foreach la condition WHERE précédente était remplacée par la nouvelle
Cedric33 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/11/2011, 00h21   #13
Modérateur
 
Avatar de h2s84
 
Homme Holty Samba SOW
Développeur .NET
Inscription : mars 2007
Messages : 2 393
Détails du profil
Informations personnelles :
Nom : Homme Holty Samba SOW
Âge : 27
Localisation : Sénégal

Informations professionnelles :
Activité : Développeur .NET
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : mars 2007
Messages : 2 393
Points : 4 089
Points : 4 089
Envoyer un message via MSN à h2s84 Envoyer un message via Skype™ à h2s84
Je comprends maintenant.

Vraiment j'aimerai savoir pourquoi tu te tapes Linq to SQL ?

Avec Entity Framework, mes tâches de recherche étaient largement facilité par Entity SQL qui me permettait de générer dynamiquement mes requêtes avec ObjectQuery. je ne sais pas on peut faire ce genre de truc avec Linq to SQL

Là je dois aller faire dodo.

Bonne chance
__________________
Les FAQs sur les technologies .Net voir ici
Les cours et tutos sur les technologies .Net voir ici
Les critiques sur les livres parlant des technologies .Net voir ici
Pensez à la balise [CODE]
Pensez au tag si votre problème est résolu

While(!success) { TryAgain(); }
h2s84 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/11/2011, 00h28   #14
Nouveau Membre du Club
 
Inscription : août 2008
Messages : 254
Détails du profil
Informations forums :
Inscription : août 2008
Messages : 254
Points : 35
Points : 35
Merci pour le temps que tu as passé.
En fait je ne savais pas comment faire mes requête et un type m'a dit "utilise LINQ tu verras c'est génial"... J'avoue que pour les trucs super simple c'est génial mais dès que ca devient très légèrement plus complexe (car au fond y'a rien de complexe dans la requête) c'est génial pour papotter sur les forum
Cedric33 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/11/2011, 08h46   #15
Membre Expert
 
Avatar de GuruuMeditation
 
Homme Olivier Matis
Software Architect
Inscription : octobre 2010
Messages : 767
Détails du profil
Informations personnelles :
Nom : Homme Olivier Matis
Âge : 37
Localisation : Belgique

Informations professionnelles :
Activité : Software Architect
Secteur : Conseil

Informations forums :
Inscription : octobre 2010
Messages : 767
Points : 1 577
Points : 1 577
Envoyer un message via MSN à GuruuMeditation
Linq to SQL est abandonné par MS. Au profit de linq entity (en gros). Alors Linq c'est génial, j'aime beaucoup mais, comme pour tout, ce n'est pas la solution ultime et parfois il faut passer par une bonne vieille procédure stockée Mais, pour la majorité des cas, Linq va bien (moyennant parfois quelques acrobaties syntaxiques ) et ça vaut vraiment la peine de maitriser.
__________________
Microsoft MVP : Visual C#

MCPD - Windows Developer 4
MCPD - Web Developer 4
MCTS - Silverlight 4, Development

“If debugging is the process of removing bugs, then programming must be the process of putting them in.”
(Edsger W. Dijkstra)
GuruuMeditation est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/11/2011, 14h54   #16
Modérateur
 
Avatar de h2s84
 
Homme Holty Samba SOW
Développeur .NET
Inscription : mars 2007
Messages : 2 393
Détails du profil
Informations personnelles :
Nom : Homme Holty Samba SOW
Âge : 27
Localisation : Sénégal

Informations professionnelles :
Activité : Développeur .NET
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : mars 2007
Messages : 2 393
Points : 4 089
Points : 4 089
Envoyer un message via MSN à h2s84 Envoyer un message via Skype™ à h2s84
Citation:
Envoyé par Cedric33 Voir le message
En fait je ne savais pas comment faire mes requête et un type m'a dit "utilise LINQ tu verras c'est génial"...
Mouais... Sauf que la personne nhje t'a pas dit de quelle technologie en rapport avec Linq :
  • Linq to XML
  • Linq to Objects
  • Linq to DataSets
  • Linq to SQL
  • Linq to Entities (Entity Framework)

Dans ton cas vu qu'il s'agit d'ORM soit la personne voulait dire Linq to SQL ou Linq to Entities Bref on ne sait pas. Comme dit dans le post précédent Linq to SQL est arrêté donc autant s'orienter vers Entity Framework et utiliser Linq to Entities.
__________________
Les FAQs sur les technologies .Net voir ici
Les cours et tutos sur les technologies .Net voir ici
Les critiques sur les livres parlant des technologies .Net voir ici
Pensez à la balise [CODE]
Pensez au tag si votre problème est résolu

While(!success) { TryAgain(); }
h2s84 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/11/2011, 15h13   #17
Nouveau Membre du Club
 
Inscription : août 2008
Messages : 254
Détails du profil
Informations forums :
Inscription : août 2008
Messages : 254
Points : 35
Points : 35
Bon là c'est clair je suis complètement perdu entre LINQ to SQL et ENTITIES. Va falloir que je me renseigne sur la différence. A quoi vois-tu que c'est du LINQ to SQL que j'utilise et non pas du LINQ to ENTITIES ? Enfin si ça se voit...
Cédric, LINQ or not LINQ ? but LINQ
Cedric33 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/11/2011, 15h21   #18
Modérateur
 
Avatar de h2s84
 
Homme Holty Samba SOW
Développeur .NET
Inscription : mars 2007
Messages : 2 393
Détails du profil
Informations personnelles :
Nom : Homme Holty Samba SOW
Âge : 27
Localisation : Sénégal

Informations professionnelles :
Activité : Développeur .NET
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : mars 2007
Messages : 2 393
Points : 4 089
Points : 4 089
Envoyer un message via MSN à h2s84 Envoyer un message via Skype™ à h2s84
Citation:
Envoyé par Cedric33 Voir le message
A quoi vois-tu que c'est du LINQ to SQL que j'utilise et non pas du LINQ to ENTITIES ? Enfin si ça se voit...
T'inquiètes ma grand-mère ne m'a pas légué sa boule de crystal pour que je puisse savoir lequel des deux ORM tu utilises. Je l'ai su uniquement parce que tu l'as mentionné dans ton premier post.

Sinon pour la comparaison Linq to SQL et Entity Framework (Linq to Entities) regardes cette discussion.
__________________
Les FAQs sur les technologies .Net voir ici
Les cours et tutos sur les technologies .Net voir ici
Les critiques sur les livres parlant des technologies .Net voir ici
Pensez à la balise [CODE]
Pensez au tag si votre problème est résolu

While(!success) { TryAgain(); }
h2s84 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/11/2011, 15h32   #19
Nouveau Membre du Club
 
Inscription : août 2008
Messages : 254
Détails du profil
Informations forums :
Inscription : août 2008
Messages : 254
Points : 35
Points : 35
Je pense que j'ai du me planter en disant LINQ to SQL.... Ca doit être ENTITIES.
Vous vous dites "il est perdu lui !" ? ben oui...
Cedric33 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/11/2011, 15h35   #20
Modérateur
 
Avatar de h2s84
 
Homme Holty Samba SOW
Développeur .NET
Inscription : mars 2007
Messages : 2 393
Détails du profil
Informations personnelles :
Nom : Homme Holty Samba SOW
Âge : 27
Localisation : Sénégal

Informations professionnelles :
Activité : Développeur .NET
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : mars 2007
Messages : 2 393
Points : 4 089
Points : 4 089
Envoyer un message via MSN à h2s84 Envoyer un message via Skype™ à h2s84
Question assez simple : le fichier contenant ton modèle (avec les entités etc...) porte quelle extension ?
__________________
Les FAQs sur les technologies .Net voir ici
Les cours et tutos sur les technologies .Net voir ici
Les critiques sur les livres parlant des technologies .Net voir ici
Pensez à la balise [CODE]
Pensez au tag si votre problème est résolu

While(!success) { TryAgain(); }
h2s84 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 13h51.


 
 
 
 
Partenaires

Hébergement Web