Tengo una matriz de cadenas de tamaño variable, y estoy tratando de realizar un ciclo programático de la matriz y unir todas las filas en una tabla donde la columna "Etiquetas" contiene al menos una de las cadenas en la matriz. Aquí hay un código de pseudo:Cómo agregar dinámicamente el operador OR a la cláusula WHERE en LINQ
IQueryable<Songs> allSongMatches = musicDb.Songs; // all rows in the table
puedo consultar fácilmente este filtrado mesa en un conjunto fijo de cuerdas, así:
allSongMatches=allSongMatches.Where(SongsVar => SongsVar.Tags.Contains("foo1") || SongsVar.Tags.Contains("foo2") || SongsVar.Tags.Contains("foo3"));
Sin embargo, esto no funciona (me da el siguiente error: "una expresión lambda con un cuerpo de la declaración no puede ser convertido a un árbol de expresión")
allSongMatches = allSongMatches.Where(SongsVar =>
{
bool retVal = false;
foreach(string str in strArray)
{
retVal = retVal || SongsVar.Tags.Contains(str);
}
return retVal;
});
¿alguien puede mostrar la estrategia correcta para lograr esto? Todavía soy nuevo en el mundo de LINQ :-)
Gracias Mehrdad, la solución llegó en un tiempo récord y funcionó como un encanto! No tenía conocimiento de la clase PredicateBuilder. ¡Qué característica más útil! También aprecio su comentario sobre el uso de una variable temporal para mantener las cuerdas ... ¡eso me hubiera vuelto loco! Victor –
De nada! –
Me confundí sobre la expresión False para crear la búsqueda varPredicate, This need to be false? o cualquier otra cosa cabría? (Hablando del PredicateBuilder.False()) –
Daniel