Заменить тип в дереве выражений
Я борюсь с модификацией дерева выражений. Я упростил пример, чтобы его было проще отображать здесь. Давайте начнем с двух классов:
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, я что-то ломаю. Как я могу создать новое выражение с правильным типом, который принимает (или перестраивает) тело исходного выражения?