J'ai un tableau de chaînes de taille variable, et j'essaie de faire une boucle dans le tableau et de faire correspondre toutes les lignes d'une table où la colonne "Tags" contient au moins une des chaînes dans le tableau. Voici un code pseudo:Comment ajouter dynamiquement l'opérateur OU à la clause WHERE dans LINQ
IQueryable<Songs> allSongMatches = musicDb.Songs; // all rows in the table
Je peux facilement interroger ce filtrage de table sur un ensemble fixe de chaînes, comme ceci:
allSongMatches=allSongMatches.Where(SongsVar => SongsVar.Tags.Contains("foo1") || SongsVar.Tags.Contains("foo2") || SongsVar.Tags.Contains("foo3"));
Cependant, cela ne fonctionne pas (je reçois l'erreur suivante: « une expression lambda avec un corps de déclaration ne peut pas être converti en un arbre d'expression »)
allSongMatches = allSongMatches.Where(SongsVar =>
{
bool retVal = false;
foreach(string str in strArray)
{
retVal = retVal || SongsVar.Tags.Contains(str);
}
return retVal;
});
Quelqu'un peut-il me montrer la bonne stratégie pour y parvenir? Je suis encore nouveau dans le monde de LINQ :-)
Merci Mehrdad, votre solution est venue en un temps record et a travaillé comme un charme! Je n'étais pas au courant de la classe PredicateBuilder. Quelle fonctionnalité pratique! J'apprécie aussi votre commentaire sur l'utilisation d'une variable temporaire pour tenir les cordes ... qui m'aurait rendu fou! Victor –
De rien! –
J'ai obtenu Confus au sujet de l'expression False pour créer la var searchPredicate, Cela doit être faux? ou quoi que ce soit d'autre pourrait convenir? (Parler du PredicateBuilder.False()) –
Daniel