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);