2010-09-15 8 views
0
Error 4 Cannot implicitly convert type 
'System.Collections.Generic.IEnumerable<System.Collections.Generic.IEnumerable<CCE_2009.Data.Person>>' 
to 
'System.Collections.Generic.IEnumerable<CCE_2009.Data.Person>' 

généré à partir de:Cast m'a tué -?

var RecoveryManagerQuery = 
    from RM in 
    (
     from REP in e.Results 
     select REP.Organization.Representatives.Select(RM=>RM.Person) 
    ) 
    select RM; 
RecoveryManagers = new ObservableCollection<Person>(RecoveryManagerQuery.ToList()); 

Pourquoi ce IEnumberable embeded - Les organisations ont un ou plusieurs représentants où chaque représentant est lié à une et une seule personne.

Je veux une liste des personnes qui correspondent à ce critère .....

argghh ..

R

+0

Du calme, prenez une profonde respiration. Ensuite, vous collez tout le message d'erreur et donnez un peu plus de contexte sur ce que e représente, est-ce LINQ2Objects ou LINQ2SQL? –

Répondre

3

La requête externe est redondant. Nous pouvons faire cela plus clair en le retirant:

var RecoveryManagerQuery = 
    from REP in e.Results 
    select REP.Organization.Representatives.Select(RM=>RM.Person); 

Comme vous pouvez le voir, la clause select dit, pour chaque REP, pour sélectionner toutes les personnes associées à des représentants de l'organisation de REP. Cela signifie que chaque élément dans RecoveryManagerQuery va être un défini de Person objets, pas un objet individuel. Vous voulez aplatir la requête afin qu'il retourne un ensemble de Person objets, pas un ensemble d'un ensemble de Person objets:

var RecoveryManagerQuery = 
    from REP in e.Results 
    from orgRep in REP.Organization.Representatives 
    select orgRep.Person; 

Edit: Voici la notation de points:

e.Results.SelectMany(
    REP => REP.Organization.Representatives, 
    (REP, orgRep) => orgRep.Person); 
+0

Je vois dans votre exemple que c'est un seul select, et donc, une seule collection. Comment écririez-vous cela en notation par points? var RecoveryManagerQuery = e.Results.Select (P => P.Organization.Representatives.Select (RM => RM.Person)); mais cela aussi a deux sélections et génère la même erreur .. juste curieux à ce moment-là! – codeputer

+0

Je l'ai eu à travailler de cette façon - semble beaucoup plus compliqué que je pense qu'il devrait être: e.Results.Select (P => P.Organization.Representatives) .SelectMany (Reps => Reps.ToArray()). Sélectionnez (Rep => Rep.Person); – codeputer

+0

@codputer: J'ai ajouté la notation pointée à ma réponse. –

0

Qu'est-ce que Essaies-tu de réaliser? Vous obtenez un IEnumerable d'un IEnumerable à cause de la requête LINQ imbriquée.

En fonction de ce que vous essayez d'atteindre, vous pouvez changer votre requête:

var RecoveryManagerQuery = 
    from REP in e.Results 
    select REP.Organization.Representatives.Select(RM=>RM.Person); 
+0

Je l'ai testé et il a quand même retourné un IEnumerable au sein d'un IEnumberable ... ce qui me semble logique maintenant car ils sont deux sélectionnés d'où les deux collections ... voir la réponse pour éviter le double select – codeputer