Tengo un formulario con múltiples campos (nombre de la empresa, código postal, etc.) que permite a un usuario buscar compañías en una base de datos. Si el usuario ingresa valores en más de un campo, entonces necesito buscar en todos esos campos. Estoy usando LINQ para consultar la base de datos.¿Cómo combino las expresiones LINQ en una sola?
Hasta ahora he logrado escribir una función que verá su entrada y la convertirá en una lista de expresiones. Ahora quiero convertir esa lista en una sola expresión que luego puedo ejecutar a través del proveedor de LINQ.
Mi primer intento fue el siguiente
private Expression<Func<Company, bool>> Combine(IList<Expression<Func<Company, bool>>> expressions)
{
if (expressions.Count == 0)
{
return null;
}
if (expressions.Count == 1)
{
return expressions[0];
}
Expression<Func<Company, bool>> combined = expressions[0];
expressions.Skip(1).ToList().ForEach(expr => combined = Expression.And(combined, expr));
return combined;
}
Sin embargo, esta falla con un mensaje de excepción en la línea de "El operador binario y no se define por ...". ¿Alguien tiene alguna idea de lo que debo hacer para combinar estas expresiones?
EDIT: Corregí la línea donde había olvidado asignar el resultado de juntar las expresiones a una variable. Gracias por señalar eso amigos.
@Jon Skeet: 'combined' se escribirá como 'Expresión'; necesita hacer algún trabajo para devolverlo como 'Expression>'. –
jason
Acepto que su primer código es más fácil de entender, por lo que haré de esto la respuesta correcta. Sin embargo, en realidad voy a utilizar el segundo fragmento, ya que es exactamente lo que necesito. Estaba haciendo las cosas demasiado complejas, gracias Jon. – gilles27
Irónicamente estaba editando mientras escribía estos dos comentarios, pero como se utilizó este segundo fragmento, creo que lo dejo tal como está :) –