Zastąp typ w drzewie wyrażeń
Walczę z modyfikacją drzewa wyrażeń. Uprościłem przykład, aby ułatwić wyświetlanie tutaj. Zacznijmy od dwóch klas:
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; }
}
Wszystkie właściwości w klasie Filter istnieją również w klasie Entity. Teraz chciałbym użyć klasy Filter, aby zwrócić żądane elementy za pomocą metody takiej jak ta:
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);
}
}
Więc po prostu zmieniam typ parametru wyrażenia. Teraz, gdy wywołam taką funkcję:
public IEnumerable<Entity> GetFilteredEntities()
{
return GetEntities(x => x.FilterableProperty1 == "Test");
}
Otrzymuję wyjątek mówiący, że parametr x nie został znaleziony w określonym wyrażeniu zapytania. Oczywiście przez zastąpienie wyrażenia ParameterExpress coś łamie. Jak mogę utworzyć nowe wyrażenie z prawidłowym typem, który przejmuje (lub odbudowuje) treść oryginalnego wyrażenia?