Заменить тип в дереве выражений

Я борюсь с модификацией дерева выражений. Я упростил пример, чтобы его было проще отображать здесь. Давайте начнем с двух классов:

    public class Filter
    {
        public string FilterableProperty1 { get; set; }
        public string FilterableProperty2 { get; set; }
    }

    public class Entity
    {
        public string FilterableProperty1 { get; set; }
        public string FilterableProperty2 { get; set; }
        public string NonFilterableProperty { get; set; }
    }

Все свойства в классе Filter также существуют в классе Entity. Теперь я хотел бы использовать класс Filter для возврата нужных объектов с помощью метода, подобного следующему:

    public IEnumerable<Entity> GetEntities(Expression<Func<Filter, bool>> filter)
    {
        Expression<Func<Entity, bool>> convertedFilter = Expression.Lambda<Func<Entity, bool>>(
            filter.Body,
            Expression.Parameter(typeof(Entity), filter.Parameters[0].Name));

        using (MyEntities entities = new MyEntities())
        {
            return entities.Entities.Where(convertedFilter);
        }
    }

Поэтому я просто изменяю тип параметра выражения. Теперь, когда я вызываю функцию так:

    public IEnumerable<Entity> GetFilteredEntities()
    {
        return GetEntities(x => x.FilterableProperty1 == "Test");
    }

Я получаю исключение о том, что параметр x не найден в указанном выражении запроса. Очевидно, что, заменяя выражение ParameterExpression, я что-то ломаю. Как я могу создать новое выражение с правильным типом, который принимает (или перестраивает) тело исходного выражения?

Ответы на вопрос(1)

Ваш ответ на вопрос