I have used C# expressions before based on lamdas, but I have no experience composing them by hand. Given an Expression<Func<SomeType, bool>> originalPredicate, I want to create an Expression<Func<OtherType, bool>> translatedPredicate.
In this case SomeType and OtherType have the same fields, but they are not related (no inheritance and not based on a common interface).
Background: I have a repository implementation based on LINQ to SQL. I project the LINQ to SQL entities to my Model entities, to keep my model in POCO. I want to pass expressions to the repository (as a form of specifications) but they should be based on the model entities. But I can’t pass those expressions to the data context, since it expects expressions based on the LINQ to SQL entities.
With
Expression, the simplest way is with a conversion expression:Note however that this will be supported differently by different providers. EF might not like it, for example, even if LINQ-to-SQL does.
The other option is to rebuild the expression tree completely, using reflection to find the corresponding members. Much more complex.