Impossible de convertir ICollection à IEnumerable

c# expression expression-trees icollection ienumerable

Question

Je construis l'arbre d'expression:

{x => x.principal_info.First (). agent_for_property_info}

Cela fonctionne comme prévu.

En fait, je dois le convertir en IEnumerable au lieu de ICollection comme vous pouvez le voir ici.

Voici la méthode qui fonctionne:

public Expression<Func<T, IEnumerable<K>>> GetGenericExpression<T, K>(bool first = false, params string[] properties)
    {
        var expression = GetNavigationPropertySelector<T, K>(typeof(T), first, properties);

        var expRight = (Expression<Func<T, IEnumerable<K>>>)expression;

        return expRight;
    }

Dans l'expression, j'obtiens l'expression lambda valide:

{x => x.principal_info.First (). agent_for_property_info}

Quand je lance:

var expRight = (Expression<Func<T, IEnumerable<K>>>)expression;

Je reçois une exception:

Unable to cast object of 
type 
'System.Linq.Expressions.Expression`1[System.Func`2[SomeModel1,
System.Collections.Generic.ICollection`1[SomeModel]]]' 
to type 
'System.Linq.Expressions.Expression`1[System.Func`2[SomeModel1
,System.Collections.Generic.IEnumerable`1[SomeModel]]]'.

Je savais ICollection hérite de IEnumerable supposant que c'est quelque chose d'assez facile à réparer.

J'ai fait beaucoup de recherches mais je n'ai pas trouvé la solution pour ICollection<T> en IEnumerable<T> ou si cela était possible.

En fait, le compilateur peut le lancer implicitement car ces lignes sont valides:

var queryData1 = new QueryData<contact_info, IEnumerable<property_info>>()
                {
                    WhereClause = expression,
                    SelectClause = info => info.principal_info.First().agent_for_property_info
                };

Comme cette expression est un type de ICollection :

info => info.principal_info.First (). agent_for_property_info

Réponse acceptée

Après quelques heures de recherche et d’essai de différentes approches, j’ai imaginé Idea pour tenter de surmonter cette exception. Donc, la solution de contournement que j’utilisais était la suggestion des commentaires:

x => x.principal_info.First (). agent_for_property_info.Select (x4 => x4)

Voici ce que j'ai ajouté en construisant une expression:

var result1 = Expression.Call(
                    typeof(Enumerable), "Select", new Type[] { elementResultType, elementResultType },
                    resultProperty, resultExpr);

En fait, je n'ai pas trouvé la solution, mais si quelqu'un rencontrait un tel problème, cette réponse pourrait peut-être lui faire gagner du temps.



Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi