2009-03-27 8 views
1

J'ai une configuration où j'ai utilisé l'héritage Linq2SQL. Pour effectuer des requêtes plus facile, j'expose les types dérivés du DataContext ainsi, comme ce qui suit:Types hérités Linq2SQL et requête OfType

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

Appel cela fonctionne parfaitement, et je peux voir le SQL généré correctement. Le type de support est DataQuery <T>.

Le problème survient lorsque j'attribue ce IEnumerable à une source de données (un contrôle ou une BindingSource). D'après ce que je peux voir, l'objet DataQuery est interrogé pour un IListSource. Et cela fournit heureusement cela. Ensuite, il procède à la création d'une BindingList, qui échoue en tant que paramètre de type des 2 arguments fournis (IEnumerable < Dérivé > et Table <Base>) ne correspond pas. Il soulève une exception de MissingMethod car le constructeur ne peut pas être trouvé.

La solution de contournement simple est juste d'appeler ToList() sur le IQueryable < dérivé > avant d'affecter à la source de données, puis cela fonctionne, mais c'est assez fatigant.

Des suggestions pour gérer cela sans «perdre» le IQueryable?

Merci

leppie

MISE À JOUR:

Le bug a maintenant été signalé à MS. Plus de détails here. Merci Marc!

Répondre

2

Confirmé. On dirait un bug pour moi; vous devriez l'enregistrer sur Connect. L'équipe are fixing LINQ-to-SQL bugs, donc il pourrait ne pas être ignoré. Pour l'instant, utilisez .ToList() etc.

Exemple de code: (! Pas encore les gars fixes MS)

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

Merci :) Hehe, j'ai pris la longue route d'enquête via Reflector :) – leppie

+0

@leppie - hélas, je suis déjà douloureusement familier avec la route de telles liaisons prennent ... –

0

J'ai eu le même problème. Pour conserver l'IQueryable, j'ai effectué un .Cast<object>() lors de l'affectation à la source de données (je l'utilise pour sortir un fichier xls de n'importe quelle table L2S que je veux dans un site Web DynamicData).

Questions connexes