|
Publicité ' | |||||||||||||||||||||||
|
|
#1 | ||||
|
Invité régulier
![]() Aude Masly Inscription : janvier 2010 Messages : 34 ![]() |
Bonjour,
J'ai constaté un comportement étrange sur une requête Linq To Entities. Pour l'histoire, j'ai une table contenant des clients avec, entre autre, un champ NomPrenom. L'utilisateur peut faire une recherche en saisissant un nom/prenom dans un seul champ. Pour que la recherche marche bien, on a fait une table de mot qui permet de savoir quels clients est concerné par chaque mot. Si l'utilisateur tape "Alain Dupont" (ou "Dupont Alain"), ça doit renvoyer tous les clients qui ont à la fois le mot Alain et le mot Dupont. Pour faire la recherche, j'avais donc fait ça dans ma fonction Code :
Le problème, c'est qu'au lieu de renvoyer les clients qui ont à la fois le mot "Alain" et le mot "Dupont", ça me renvoie les clients qui ont le mot "Alain" ou le mot "Dupont". Pour comprendre d'ou venait le problème, j'ai essayé de faire ça : Code :
Quelqu'un pourrait m'expliquer le pourquoi. Je ne vois pas quelle est la différence entre mon foreach et mon deuxième code. Sur le papier, c'est pareil. |
||||
|
|
00
|
|
|
#2 | ||
![]() ![]() |
Salut,
Le problème est simple je pense : la fonction Contains teste si une chaîne de caractères est une sous chaîne d'une autre chaîne. Cette fonction ne se met à tester si chaque partie de la sous-chaîne est contenue dans la chaîne. Donc une fois que t'as compris cela, c'est à toi de "splitter" ta chaîne en mot et de tester si chaque mot est bien une partie de la chaîne source : Code C# :
|
||
|
00
|
|
|
#3 | |||||
|
Invité régulier
![]() Aude Masly Inscription : janvier 2010 Messages : 34 ![]() |
Citation:
Code :
string[] tabNomPrenom = chaineRecherche.Split(' '); Code :
q = q.Where(ocn => ocn.Client.MotOes.Any(mot => mot.Lib.ToUpper().Contains(item.ToUpper())); Code :
q = q.Where(ocn => ocn.Client.MotOes.Any(mot => mot.Lib.ToUpper().Contains("Alain".ToUpper())); Code :
q = q.Where(ocn => ocn.Client.MotOes.Any(mot => mot.Lib.ToUpper().Contains("Dupont".ToUpper())); Code :
Concernant la solution que tu proposes, ça doit fonctionner mais le problème est que je ne suis pas supposée connaitre le nombre d'éléments qu'il y a aura dans le tableau. Normalement, il devrait y en avoir 1 ou 2 mais bon, on ne sait jamais. Je trouve pas ça super d'écrire "en dur" mots[0], mots[1]. C'est pas assez flexible. |
|||||
|
|
00
|
|
|
#4 |
|
Membre expérimenté
![]() Nicolas Inscription : janvier 2011 Messages : 378 ![]() |
As-tu regardé dans SQL Profiler ce qui avait été généré par linq ?
|
|
|
00
|
|
|
#5 | ||
|
Membre Expert
![]() ![]() |
Est-ce que ce ne serait pas un problème de "closure"?
Vu que la query est exécutée lorsque l'on regarde les résultats => elle est en fait executée hors de la boucle. Ce qui fait que tous les item utilisé dans le foreach va en fait pointer sur le dernier. En gros, il ne va chercher que le dernier nom dans le tableau chaineRecherche. A tester, pour éviter la closure : Code C# :
__________________
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) |
||
|
00
|
|
|
#6 | |||
|
Invité régulier
![]() Aude Masly Inscription : janvier 2010 Messages : 34 ![]() |
Citation:
![]() J'ai testé et c'est bien un problème de closure. Je connaissais ce problème mais j'y avais pas pensé pour ce cas précis. Merci pour ton aide ! |
|||
|
|
00
|
Copyright © 2000-2012 - www.developpez.com