Si fa con gli alberi di espressione, questo è il caso specifico del tuo esempio ma si puo creare qualsiasi tipo di query anche piu complessa:
codice:
public class Searcher<TModel, TField>
{
public static IQueryable<TModel> Search(IQueryable<TModel> dbSet, string campo, TField valore)
{
ParameterExpression pe = Expression.Parameter(typeof(TModel), "entity");
Expression left = Expression.Property(pe, typeof(TModel).GetProperty(campo));
Expression right = Expression.Constant(valore, typeof(TField));
Expression e2 = Expression.Equal(left, right);
MethodCallExpression whereCallExpression = Expression.Call(
typeof(Queryable),
"Where",
new Type[] { dbSet.ElementType },
dbSet.Expression,
Expression.Lambda<Func<TModel, bool>>(e2, new ParameterExpression[] { pe }));
IQueryable<TModel> results = dbSet.Provider.CreateQuery<TModel>(whereCallExpression);
return results;
}
}
Se vuoi capirla per bene e sfruttarla a pieno devi studiarti gli Expression Tree.
lo usi cosi:
codice:
var trentacinquenni = Searcher.Search<Persona, int>(elenco.AsQueryable(), "Eta", 35);