Arbre d&#39;expression pour la liste de collection enfant <string> .Tout

c# expression-trees lambda linq

Question

Je construis une requête linq générique en utilisant un arbre d'expression. Je suis bloqué lors de la création d'une expression sur une collection enfant. L'appel de méthode explose à cause de types incompatibles. Normalement, je sais quoi mettre là, mais l'appel de la méthode Any () m'a confondu. J'ai essayé tous les types auxquels je peux penser et pas de chance. Toute aide serait appréciée.

Voici ma classe d'entité:

public class Story : Entity
{
    public string Author { get; set; }

    public IList<string> Contributors { get; set; }
}

Requête pour laquelle je veux générer un arbre d'expression:

public class Story : Entity
{
    public string Author { get; set; }

    public IList<string> Contributors { get; set; }
}

Ce que j'ai jusqu'à présent

public class Story : Entity
{
    public string Author { get; set; }

    public IList<string> Contributors { get; set; }
}

C'est comme ça que j'utilise des expressions:

public class Story : Entity
{
    public string Author { get; set; }

    public IList<string> Contributors { get; set; }
}

Mais après avoir exécuté ce code, j'obtiens cette erreur que je ne parviens pas à résoudre.

Aucune méthode générique 'Any' sur le type 'System.Linq.Queryable' n'est compatible avec les arguments de type fournis. Aucun argument de type ne doit être fourni si la méthode est non générique. Description: une exception non gérée s'est produite lors de l'exécution de la demande Web en cours. Consultez la trace de la pile pour plus d'informations sur l'erreur et son origine dans le code.

Détails des exceptions: System.InvalidOperationException: Aucune méthode générique 'Tout' sur le type 'System.Linq.Queryable' n'est compatible avec les arguments de type et les arguments fournis. Aucun argument de type ne doit être fourni si la méthode est non générique.

Erreur de source:

Ligne 184: {Ligne 185:
var overload = typeof (Queryable) .GetMethods (). Single (mi => mi.Name == "Any" && mi.GetParameters (). Count () == 2); Ligne 186:
Expression.Call (typeof (Queryable), "Any", new [] {typeof (chaîne)}, propertyExpression, ou); Ligne 187:
valueExpression = Expression.Call (typeof (Enumerable), "Tous", nouveau [] {typeof (chaîne)}, propertyExpression ou Expression.Constant ("Test",

Réponse acceptée

Vous n'appelez pas Any méthode partout dans votre code.

Vous devriez étendre Contains , exemple:

case FilterOperator.Contains:
    // if collection
    if (propertyExpression.Type.IsGenericType &&
        typeof(IEnumerable<>)
            .MakeGenericType(propertyExpression.Type.GetGenericArguments())
            .IsAssignableFrom(propertyExpression.Type))
    {
        // find AsQueryable method
        var toQueryable = typeof(Queryable).GetMethods()
            .Where(m => m.Name == "AsQueryable")
            .Single(m => m.IsGenericMethod)
            .MakeGenericMethod(typeof(string));

        // find Any method
        var method = typeof(Queryable).GetMethods()
            .Where(m => m.Name == "Any")
            .Single(m => m.GetParameters().Length == 2)
            .MakeGenericMethod(typeof(string));

        // make expression
        condition = Expression.Call(
            null, 
            method,
            Expression.Call(null, toQueryable, propertyExpression), 
            filterCriteria.Expression
        );
    }
    else
    {
        condition = Expression.Call(propertyExpression, typeof(string).GetMethod("Contains", new[] { typeof(string) }), valueExpression);
    }
    break;

Vous devez également avoir créé un paramètre p ( Expression.Parameter(query.ElementType, "p") ), sinon vous obtiendrez la variable 'p' of type 'WpfApplication2.Story' referenced from scope '', but it is not defined erreur variable 'p' of type 'WpfApplication2.Story' referenced from scope '', but it is not defined . .

Vous pouvez passer un parameter de la méthode Filter méthode ToExpression .




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