Bonjour à tous,
Dans une application, j'utilise une base de données MySQL.
J'essaie de programmer une requête du type "moteur de recherche".
En effet, dans un champs, je saisi une chaîne de caractère (peu importe que ça forme un mot ou nom). Cette chaîne de caractère est un nom d'ingrédient.
Cette chaîne de caractère est alors comparé à tous les ingrédients de la base.
- Si l'ingrédient de la table de la base de données contient la chaîne de caractères, je récupère l'ID de l'ingrédient.
A ce stade nous avons donc une liste d'ID d'ingrédient (IDingredient) distinct.
- Ensuite, je fais parcourir une second table en recherchant les ID recette (IDrecipe) qui contienne l'IDingredient précedemment obtenu.
Nous avons donc une liste d'IDrecipe distinct.
- Enfin, je fais parcourir une troisième table en recherchant les infos des colonnes pour chaque IDrecipe.
J'ai donc une liste d'objet "RecipeDisplayed" distinct.
Chaque requête indépendante retourne bien le résultat souhaité.
Lorsque je passe dans le code C#, je cascade des "foreach" de cette façon :
Lors de l'exécution du script, je me retrouve avec plusieurs objets qui peuvent être identique.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26 private void displayListSource(string ingredientSelection) { RecipeListSource = new ObservableCollection<RecipeDisplayed>(); foreach (var item_0 in RecipeDisplayedProvider.selectList_IDingredient_WithSpecificNameIngredient(ingredientSelection)) // foreach_1 { foreach (var item_1 in RecipeDisplayedProvider.selectList_IDrecipe_WithIDingredient(item_0)) // foreach_2 { foreach (var item_2 in RecipeDisplayedProvider.selectList_recipe_WithIDrecipe(item_1)) // foreach_3 { RecipeListSource.Add(new RecipeDisplayed { recipeDisplayedID = item_2.recipeDisplayedID, recipeDisplayedPicture = item_2.recipeDisplayedPicture, recipeDisplayedName = item_2.recipeDisplayedName, recipeDisplayedNumberPart = item_2.recipeDisplayedNumberPart, recipeDisplayedNumberDuration = item_2.recipeDisplayedNumberDuration, recipeDisplayedNumberDescription = item_2.recipeDisplayedNumberDescription, }); //TODO : Suppression Doublons en fonction du Nom recette //var distinctItems = RecipeListSource.GroupBy(x => x.recipeDisplayedName).Select(y => y.First()); } } } }
Pourquoi ?
Prenons un exemple.
Je souhaite rechercher l'ingrédient "o" (je voulais rechercher "oeuf", mais erreur de frappe admettons).
La première requête retourne la liste distincte suivante :
(J'ai ajouté le "Name" afin de bien voir que chaque ingrédient possède la chaîne de caractère "o")
Le script va exécuter le "foreach_3" pour chaque cas du "foreach_2" qui a sont tour va s'exécuter pour chaque cas du "foreach_1" ce qui est le fonctionnement normal en lisant le code.
Seulement ça me crée le problème suivant.
Pour un "Risotto au saumon" par exemple, il faut du "Riz pour risotto", du "saumon fumé" et du "fromage allégé".
Ces trois ingrédients possèdent la chaîne de caractère "o". Le programme va donc créer trois objets "Risotto".
J'ai tenté de faire une requête LINQ sur la liste finale. Pour le moment sans succès.
Auriez-vous des éléments de réponses ?
PS : Complétement hors sujet, la technologie MySQL en local est instantanée. Lorsque je bascule ma base sur un serveur, j'ai entre 2 et 3 secondes de temps de réponses pour l'exécution des requêtes.
Je pense que de ce fait l'utilisation des fonctions synchrones va être primordiale, mais connaissez vous des solutions plus rapides ?
Partager