Cześc.
Proszę o pomoc w sprawie konwersji między typami. Oto istota problemu:
- Mamy klasy:
internal class InternalClass
{
public int FirstProperty { get; private set; }
public int SecondProperty {get; private set; }
public static implicit operator PublicClass(InternalClass internalClass)
{
PublicClass result = new PublicClass();
result.First = internalClass.FirstProperty;
result.Second = internalClass.SecondProperty;
return result;
}
}
public class PublicClass
{
public int First {get; set; }
public int Second {get; set; }
}
Jak widać prosta konwersja miedzy obiema typami. Klasa publiczna to po prostu klasa POCO (tutaj znacznie uproszona) widoczna w całej domenie aplikacji. Natomiast klasa InternalClass to obiekt encyjny pochodzący z ORM'u (LinQ To SQL). Zasadność takiego rozwiązania, jest taka, że Context i generalnie struktura źródła danych jest wymienna natomiast klasy encyjne chcę utrzymać niezmienne. Mniejsza o to. Do rzeczy:
Pobieranie wszystkich rekordów z tabeli InternalClass realizuję w prosty sposób:
return Context.InternalClass.Cast<PublicClass>();
pojawia się natomiast problem, gdybym chciał pobrać tylko wybrane rekordy:
public IEnumerable<PublicClass> GetByCondition(Expression<Func<PublicClass, bool>> condition)
{
return Context.InternalClass.Where(condition); // bad error
}
niestety pojawia się problem, gdyż where przyjmuję warunek
Expression<Func<InternalClass, bool>>
a ja mam taki jak podany w deklaracji, a naturalnie nie mogę na zewnątrz uwidocznić InternalClass. To nie wchodzi w grę.
Oczywiście mógłbym zrobić to nadmiarowo:
public IEnumerable<PublicClass> GetByCondition(Func<PublicClass, bool> condition)
{
return Context.InternalClass.Cast<PublicClass>().Where(condition);
}
Teraz mogłem pozbyć się ubierania tego w Expression, ale chyba nie o to chodzi, bo teraz zostaną przefiltrowane rekordy po pobraniu wszystkich z bazy.
Tak wiec zasadnicze pytanie brzmi - jak przekonwertować Expression<Func<PublicClass, bool>>
na Expression<Func<InternalClass, bool>>
znając sposób konwersji miedzy obiektami PublicClass i InternalClass.
Z góry dzięki za pomoc.