2010-07-08 2 views
2

Je joue avec la commande IQueryProvider.Execute et je passe une expression qui fait partie de mon projet d'arborescence d'expression. Cette commande me renvoie un objet qui peut être soit un OrderedEnumerable ou un GroupedEnumerable en fonction de l'expression d'origine. Une expression GroupBy crée l'objet GroupedEnumerable. Le code suivant crée également un objet GroupedEnumerable qui vous montrera un exemple du problème que j'ai.Comment lancer un GroupedEnumerable?

List<int> numbers = new List<int> { 1, 7, 16, 23, 41, 66 }; 
object grouped = numbers.GroupBy(n => n % 2 == 0); 

Lorsque « groupé » est un objet (de GroupedEnumerable) Je ne peux pas le jeter à tout autre type qui me permettra d'appeler « GetEnumerator » à ce sujet. Je suis également incapable de le lancer sur tout ce qui me permettra de l'utiliser avec une commande "foreach" par exemple. Si je change le code pour utiliser un "var" (comme indiqué ci-dessous), grouped est maintenant de type OrderedEnumerable. Je peux obtenir l'énumérateur et l'utiliser dans une commande foreach.

List<int> numbers = new List<int> { 1, 7, 16, 23, 41, 66 }; 
var grouped = numbers.GroupBy(n => n % 2 == 0); 

Pour en revenir à mon projet d'arbre d'expression, la commande retourne un objet IQueryProvider.Execute mais je dois être en mesure de jeter l'objet d'un OrderedEnumerable lorsque l'objet est un GroupedEnumerable. Tous les moulages que j'ai essayés montrent une erreur sur le modèle de "Impossible de lancer l'objet de type 'System.Linq.GroupedEnumerable`3 pour taper .....". Quelqu'un peut-il me dire comment utiliser l'objet pour quelque chose de plus utile?

+0

Veuillez démontrer votre tentative de lancer et l'erreur qui en résulte. –

+0

Qu'essayez-vous d'accomplir? Si vous voulez juste les nombres pairs, vous devriez utiliser Where(), pas GroupBy(). – Qwertie

+0

L'exemple de code est juste un exemple de comment obtenir un GroupedEnumerable. Vous verrez à partir de ma question que j'utilise la méthode IQueryProvider.Execute qui retourne un objet qui est en fait de type GroupedEnumerable. Mon problème est de lancer ceci et rien à faire avec des nombres pairs. – Retrocoder

Répondre

5

Le résultat de votre appel GroupBy sera IEnumerable<IGrouping<bool, int>>. Vous pouvez le voir si vous survolez le mot var dans votre deuxième exemple de code. Cast à ce type et cela fonctionnera correctement.

List<int> numbers = new List<int> { 1, 7, 16, 23, 41, 66 }; 
object grouped = numbers.GroupBy(n => n % 2 == 0); 

IEnumerable<IGrouping<bool, int>> foo = 
    (IEnumerable<IGrouping<bool, int>>)grouped; 

Modifier

Après vos commentaires ci-dessus, si la sortie de votre appel est GroupedEnumerable<MyEntityItem,int?,MyEntityItem>, alors vous pouvez le jeter aux IEnumerable<IGrouping<int?, MyEntityItem>>.

+0

Lorsque j'essaie de lancer de cette façon, il ne compilera pas car il donne l'erreur "IEnumerable nécessite 1 argument de type – Retrocoder

+0

@Retrocoder: Désolé, j'ai édité la réponse, donnez-moi une chance –

+0

Salut, ça a marché bien, donc j'ai maintenant l'objet cast à un GroupedEnumerable qui est ce que je voulais, merci beaucoup pour cela.Vous pouvez peut-être m'aider avec une deuxième question.Ce code se trouve dans la méthode "IEnumerator GetEnumerator()" d'une classe qui dérive de IOrderedQueryable . Je trouve que je ne peux pas renvoyer l'énumérateur de "GroupedEnumerable " comme le cast jette une erreur. – Retrocoder

2

Il vous suffit de convertir l'objet en IEnumerable<T>. L'implémentation énumérable ne devrait pas vous importer.