Comment ajouter dynamiquement OU de l'exploitant d'clause where dans LINQ
J'ai une variable de taille de tableau de chaînes de caractères, et je suis en train d'en programmant boucle à travers le tableau et le match de toutes les lignes dans un tableau où la colonne "Tags" contient au moins une des chaînes dans le tableau. Voici le pseudo-code:
IQueryable<Songs> allSongMatches = musicDb.Songs; //all rows in the table
Je peut facilement effectuer une requête sur cette table de filtrage 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"));
Toutefois, cela ne fonctionne pas (j'obtiens l'erreur suivante: "Une expression lambda avec une déclaration corps ne peut pas être convertie en une arborescence 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 me montrer la bonne stratégie pour accomplir cette? Je suis encore nouveau dans le monde de LINQ 🙂
Vous devez vous connecter pour publier un commentaire.
Vous pouvez utiliser le
PredicateBuilder
classe:LinqToSql comportement étrange
J'ai récemment créé une méthode d'extension pour la création de chaînes de recherche qui permet aussi
OR
recherches. Blogué sur iciJ'ai aussi créé un package nuget, vous pouvez l'installer:
http://www.nuget.org/packages/NinjaNye.SearchExtensions/
Une fois installé, vous serez en mesure de faire ce qui suit
Si vous souhaitez créer votre propre version de permettre à la ci-dessus, vous devez effectuer les opérations suivantes:
Sinon, vous pouvez prendre un coup d'oeil sur le projet github pour
NinjaNye.SearchExtensions
comme cela a d'autres options et a été quelque peu remaniée pour permettre à d'autres combinaisonsSoit pour construire un
Expression<T>
vous-même, ou regarder un itinéraire différent.En supposant possibleTags est une collection de balises, vous pouvez faire usage de l'une de fermeture et une jointure pour trouver des correspondances. Cela devrait trouver des chansons avec au moins une balise dans possibleTags:
Il est un autre, un peu plus facile méthode qui permet d'accomplir cela. ScottGu le blog de détails dynamique linq bibliothèque que j'ai trouvé très utile dans le passé. Essentiellement, il génère la requête à partir d'une chaîne de caractères que vous transmettez. Voici un exemple de code que vous écrirez:
Plus d'informations peuvent être trouvées à scottgu blog ici.