Заменить тип в дереве выражений
Я борюсь с модификацией дерева выражений. Я'Мы упростили пример, чтобы его было проще отображать здесь. Позволять'Начнем с двух классов:
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 GetEntities(Expression filter)
{
Expression convertedFilter = Expression.Lambda(
filter.Body,
Expression.Parameter(typeof(Entity), filter.Parameters[0].Name));
using (MyEntities entities = new MyEntities())
{
return entities.Entities.Where(convertedFilter);
}
}
Поэтому я просто изменяю тип параметра выражения. Теперь, когда я вызываю функцию так:
public IEnumerable GetFilteredEntities()
{
return GetEntities(x => x.FilterableProperty1 == "Test");
}
Я получаю исключение о том, что параметр x не найден в указанном выражении запроса. Очевидно, что заменяя выражение ParameterExpression, я что-то ломаю. Как я могу создать новое выражение с правильным типом, который принимает (или перестраивает) тело исходного выражения?