c# - expressions - Cómo convertir una Expresión<Func<T, bool>> a un Predicado<T>
predicate builder c# (3)
Tengo un método que acepta una Expression<Func<T, bool>>
como parámetro. Me gustaría usarlo como un predicado en el método List.Find (), pero parece que no puedo convertirlo en un Predicado que toma la Lista. ¿Conoces una manera simple de hacer esto?
public IList<T> Find<T>(Expression<Func<T, bool>> expression) where T : class, new()
{
var list = GetList<T>();
var predicate = [what goes here to convert expression?];
return list.Find(predicate);
}
Actualizar
Combinando respuestas de tvanfosson y 280Z28, ahora estoy usando esto:
public IList<T> Find<T>(Expression<Func<T, bool>> expression) where T : class, new()
{
var list = GetList<T>();
return list.Where(expression.Compile()).ToList();
}
No veo la necesidad de este método. Solo usa Where ().
var sublist = list.Where( expression.Compile() ).ToList();
O mejor aún, defina la expresión como un lambda en línea.
var sublist = list.Where( l => l.ID == id ).ToList();
Otra opción que no se ha mencionado:
Func<T, bool> func = expression.Compile();
Predicate<T> predicate = new Predicate<T>(func);
Esto genera la misma IL como
Func<T, bool> func = expression.Compile();
Predicate<T> predicate = func.Invoke;
Func<T, bool> func = expression.Compile();
Predicate<T> pred = t => func(t);
Editar: según los comentarios, tenemos una mejor respuesta para la segunda línea:
Predicate<T> pred = func.Invoke;