4 votes

Les méthodes IQueryable ne sont pas résolues pour la variable de requête dynamique

J'essaie de comprendre comment utiliser des variables dynamiques pour mes méthodes qui utilisent des requêtes LINQ. Par exemple, cela fonctionne bien :

using (DBDataContext db = new DBDataContext()) 
{
    var query = from c in db.Users
                select
                new
                {
                    c.Firstname,
                    c.Lastname,
                    c.Age
                };

    gridUsers.VirtualItemCount = query.Count();
    gridUsers.DataSource = query.ToList();
}

Mais ça ne marche pas :

using (DBDataContext db = new DBDataContext()) 
{
    dynamic query = from c in db.Users
                select
                new
                {
                    c.Firstname,
                    c.Lastname,
                    c.Age
                };

    gridUsers.VirtualItemCount = query.Count();
    gridUsers.DataSource = query.ToList();
}

L'erreur est la suivante : "object" ne contient pas de définition pour "Count". Comment puis-je le faire fonctionner avec le mot-clé dynamique ?

10voto

Jon Skeet Points 692016

Il faudrait que tu utilises :

gridUsers.VirtualItemCount = Queryable.Count(query);
gridUsers.DataSource = Enumerable.ToList(query);

Le typage dynamique ne "fait" pas de méthodes d'extension. (Je ne suis pas complètement Je ne sais pas pourquoi. Le compilateur stocke une quantité considérable d'informations sur le site d'appel - il devrait stocker toutes les données de l'appel. using les directives associées au site d'appel aussi, en gros. Cela ralentirait également la liaison dynamique, ce qui est peut-être le problème qu'ils essaient d'éviter. Peut-être que c'était juste trop de travail pour trop peu d'avantages).

EDIT : Juste par intérêt, por qué essayez-vous d'utiliser le typage dynamique pour votre séquence en premier lieu ? Je soupçonne que vous trouverez toutes sortes de choses comme cela devient plus délicat ... LINQ dépend assez fortement de divers éléments d'inférence de type.

Notez que le fait d'avoir un IQueryable<dynamic> ou un IEnumerable<dynamic> est très bien, et fonctionnera plutôt mieux.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X