ich habe das Problem, dass ich ein IQueryable<T> in ein IObjectSet<T> überführen möchte und zur Laufzeit kein sinnvolles Ergebnis erhalte. Vorausschickend ist noch zu sagen, dass es sich um ein spezialisiertes Objekt handelt ('ClassSpecial' erbt von 'ClassBasis'). Hier ein Beispiel:
IQueryable<ClassSpecial> _b; IQueryable<ClassSpecial> B { // '_context' erlaubt den Zugriff auf die Basisobjekte 'ClassBasis' in der Datenbasis // ist ein EF 4.1 Context get { return _b ?? (_b = _context.OfType<ClassSpecial> ()); } }
// später im code public IObjectSet<T> CreateObjectSet<T> () where T : class { Type type = T.GetType (); ... if (type == typeof(B) return B as IObjectSet<T>; // <- liefert null ... }
// der Aufruf erfolgt in einer anderen Klasse, z.B. einem Repository, mit IObjectSet<ClassSpecial> ClassSpecialContainer = CreateObjectSet<ClassSpecial> ();
Kann mir da jemand helfen? Wahrscheinlich stehe ich nur auf dem Schlauch und sehe die Lösung einfach nicht!
Der Code wird nur funktionieren, wenn _b auf ein Objekt von einem Typ verweist, der IObjectSet<ClassSpecial> implementiert. _context.OfType<ClassSpecial>() liefert, soweit ich sehe, eine ObjectQuery<ClassSpecial>-Instanz, und ObjectQuery<ClassSpecial> implementiert IObjectSet<ClassSpecial> nicht.
Danke für die schnelle Reaktion. _context.OfType<ClassSpecial> liefert ein System.Linq.IQueryable<T> zurück und das wiederum wird von IObjectSet<T> implementiert. Also sollte es doch funktionieren oder?
Nein - IObjectSet<T> implementiert gar nichts, denn es ist ein Interface. Es erweitert vielmehr IQueryable<T> in dem Sinne, dass es an die implementierenden Klassen zusätzliche Anforderungen (zu implementierende Methoden) stellt. D.h. jeder, der IObjectSet<T> implementiert, implementiert dadurch automatisch auch IQueryable<T>, aber nicht umgekehrt.