2009-03-27 8 views
1

Ich habe ein Setup, wo ich Linq2SQL Vererbung verwendet. Um Abfragen zu erleichtern, belichten ich die abgeleiteten Typen in der Datacontext als auch, wie die folgenden:Linq2SQL geerbte Typen und OfType-Abfrage

public IQueryable<Derived> Derivations 
{ 
    get { return Bases.OfType<Derived>(); } // filter list on type 
} 

Aufruf dieser perfekt funktioniert, und ich kann die SQL sehen korrekt erzeugt wird. Der Hintergrundtyp ist DataQuery <T>.

Das Problem tritt auf, wenn ich IEnumerable einer Datenquelle (entweder ein Steuerelement oder eine BindingSource) zuweisen.

Von was ich sehen kann, wird das DataQuery-Objekt für eine IListSource abgefragt. Und das liefert es glücklich. Anschließend wird eine BindingList erstellt, die fehlschlägt, da der Typparameter der beiden angegebenen Argumente (IEnumerable <Derived> und Tabelle <Base>) nicht übereinstimmt. Es wird eine Ausnahme von MissingMethod ausgelöst, da der Konstruktor nicht gefunden werden kann.

Die einfache Problemumgehung ist nur ToList() auf dem IQueryable <abgeleiteten> vor dem Zuweisen der Datenquelle und dann funktioniert es, aber das ist ziemlich ermüdend.

Irgendwelche Vorschläge, um dies zu handhaben, ohne das IQueryable "zu verlieren"?

Dank

leppie

UPDATE:

Der Fehler jetzt zu MS berichtet wurde. Mehr Details here. Danke Marc!

Antwort

2

Bestätigt. Sieht für mich wie ein Käfer aus; Sie sollten es unter Connect anmelden. Das Team are fixing LINQ-to-SQL bugs, so könnte es nicht ignoriert werden. Vorerst verwenden .ToList() usw.

Beispielcode: (! Noch nicht fest MS Jungs)

using (var ctx = new MyDataContext()) 
{ 
    var qry = ctx.BaseEntities.OfType<DerivedEntity>(); 
    IListSource ls = (IListSource)qry; 
    IList list = ls.GetList(); // boom 
    /* Constructor on type 
     'System.Data.Linq.Provider.DataBindingList`1[snip]' 
     not found.*/ 
} 
+0

Danke :) Hehe, ich habe die lange Entdeckungsroute über Reflector genommen :) – leppie

+0

@leppie - ach, mir ist schon schmerzlich vertraut mit der Route solche Bindungen nehmen ... –

0

hatte ich das gleiche Problem.

Um die IQueryable zu behalten, habe ich eine .Cast<object>() bei der Zuweisung an die Datenquelle (ich verwende es, um eine XLS-Datei aus einer beliebigen L2S-Tabelle, die ich will in einer DynamicData-Website).