2011-06-06 3 views
0

J'essaie de créer une maquette à l'aide de WebMatrix en utilisant WebPages sous le capot. J'ai assigné un tableau implicitement tapé des objets anonymes à l'une des clés PageData, mais je reçois l'erreur suivante lorsque je tente d'utiliser des méthodes LINQ sur la collection:Erreur lors de l'utilisation de LINQ avec des classes anonymes et des tableaux typés implicitement dans des pages Web ASP.NET

CS1977: Cannot use a lambda expression as an argument to a dynamically dispatched operation without first casting it to a delegate or expression tree type

Voici quelques exemples de code:

@{ 
    PageData["Vals"] = new [] { 
    new { ID=1, Quantity=5 }, 
    new { ID=2, Quantity=3 } 
    }; 
    var sum = PageData["Vals"].Sum(x => x.Quantity); 
} 

Si je stocke d'abord le tableau dans un objet normal, je peux très bien utiliser les méthodes LINQ. Il semble avoir un problème quand il s'agit de PageData en tant qu'objet dynamique - mais je n'arrive pas vraiment à comprendre la sauce secrète pour la contraindre à revenir au type initial.

+2

Je n'ai jamais entendu un bon argument pour ne pas utiliser de modèles fortement typés. (ce qui ne réglerait pas le problème de manière incidente) –

+1

@Kirk Cela aura un vrai modèle - j'ai posté ce message plus en espérant aider quelqu'un d'autre sur la route qui rencontre le même message d'erreur. Une réponse constructive avec un exemple de code n'utilisant pas PageData serait probablement plus utile. – Goyuix

Répondre

2

La solution générale à ce problème consiste à le lancer explicitement. Par exemple, transtypez l'expression PageData["Vals"] en un tableau du type attendu. Toutefois, cela ne peut pas fonctionner avec des types anonymes car vous n'avez pas le handle sur son type et ne pouvez donc pas le convertir.

Une fois que vous avez stocké votre new[] { ... } dans le fichier dynamiquement PageData, vous avez perdu toutes les références au type anonyme au moment de la compilation. Par conséquent, essayer d'utiliser des opérateurs LINQ spécifiques à un type est un non-démarreur.

Comme je l'ai mentionné dans les commentaires, la bonne solution est de toujours utiliser des modèles fortement typés. Vous ne devez pas vous fier à des types anonymes déclarés et définis dans une vue pour créer une maquette de la page. Avoir la page dépend d'un vrai modèle et peupler ce modèle et le nourrir à la page.

Questions connexes