C # PredicateBuilder Entités: Le paramètre « f » n'a pas été lié dans le LINQ spécifié à l'expression d'entités

StackOverflow https://stackoverflow.com/questions/2947820

Question

Je avais besoin de construire un filtre dynamique et je voulais continuer à utiliser des entités. En raison de cette raison, je voulais utiliser le PredicateBuilder de Albahari.

Je créé le code suivant:

var invoerDatums = PredicateBuilder.True<OnderzoeksVragen>();
var inner = PredicateBuilder.False<OnderzoeksVragen>();

foreach (var filter in set.RapportInvoerFilter.ToList())
{
    if(filter.IsDate)
    {
        var date = DateTime.Parse(filter.Waarde);
        invoerDatums = invoerDatums.Or(o => o.Van >= date && o.Tot <= date);
    }
    else
    {
        string temp = filter.Waarde;
        inner = inner.Or(o => o.OnderzoekType == temp);
    }
}

invoerDatums = invoerDatums.And(inner);
var onderzoeksVragen = entities.OnderzoeksVragen
                               .AsExpandable()
                               .Where(invoerDatums)
                               .ToList();

Quand je courais le code il n'y avait que 1 filtre qui n'a pas un filtre de date. Alors que le prédicat intérieur était rempli. Lorsque le prédicat a été exécuté, je suis l'erreur suivante.

  

n'a pas été lié Le paramètre « f » dans le   LINQ spécifié à la requête des entités   expression.

Alors que la recherche d'une réponse que je trouve ce qui suit . Mais cela est déjà mis en œuvre dans le LINQKit.

Est-ce que quelqu'un d'autre a connu cette erreur et de savoir comment le résoudre?

Était-ce utile?

La solution

Je couru à travers la même erreur, la question semblait être quand j'avais fait avec prédicats PredicateBuilder qui étaient à leur tour composé d'autres prédicats faites avec PredicateBuilder

par exemple. (A ou B) et (X ou Y) où un générateur crée A ou B, une crée X ou Y et un troisième ANDs ensemble.

Avec un seul niveau de prédicats AsExpandable a bien fonctionné, lorsque plus d'un niveau a été introduit, je suis la même erreur.

Je n'ai pas pu trouver aucune aide, mais par quelques essais et erreurs, j'ai pu faire avancer les choses au travail. Chaque fois que j'ai appelé un prédicat je l'ai suivi avec la méthode d'extension Expand.

Voici un peu de code, coupé pour la simplicité:

public static IQueryable<Submission> AddOptionFilter(
    this IQueryable<Submission> query, 
    IEnumerable<IGrouping<int, int>> options)
{
    var predicate = options.Aggregate(
        PredicateBuilder.False<Submission>(),
        (accumulator, optionIds) => accumulator.Or(ConstructOptionMatchPredicate(optionIds).Expand()));
        query = query.Where(predicate.Expand());            
    return query;
}

La requête est un IQueryable qui a déjà eu AsExpandable appelé, ConstructOptionNotMatchPredicate retourne une expression.

Une fois que nous avons passé l'erreur nous étions certainement en mesure de construire des filtres complexes lors de l'exécution contre le cadre de l'entité.

Edit:

Étant donné que les gens commentent toujours et en votant cela, je suppose qu'il est toujours utile si je partage une autre solution. Au fond, je me suis arrêté à l'aide LinqKit et il est constructeur prédicat en faveur de cette Universal prédicats Builder qui a la même API, mais n'a pas besoin d'Expand appels, bien la peine de vérifier.

Autres conseils

Je suis cette erreur et l'explication de Mant101 m'a obtenu la réponse, mais vous cherchez peut-être un exemple plus simple qui cause le problème:

// This predicate is the 1st predicate builder
var predicate = PredicateBuilder.True<Widget>();

// and I am adding more predicates to it (all no problem here)
predicate = predicate.And(c => c.ColumnA == 1);
predicate = predicate.And(c => c.ColumnB > 32);
predicate = predicate.And(c => c.ColumnC == 73);

// Now I want to add another "AND" predicate which actually comprises 
// of a whole list of sub-"OR" predicates
if(keywords.Length > 0)
{
    // NOTICE: Here I am starting off a brand new 2nd predicate builder....
    // (I'm not "AND"ing it to the existing one (yet))
    var subpredicate = PredicateBuilder.False<Widget>();

    foreach(string s in keywords)
    {
        string t = s;  // s is part of enumerable so need to make a copy of it
        subpredicate = subpredicate.Or(c => c.Name.Contains(t));
    }

    // This is the "gotcha" bit... ANDing the independent
    // sub-predicate to the 1st one....

    // If done like this, you will FAIL!
//  predicate = predicate.And(subpredicate); // FAIL at runtime!

    // To correct it, you must do this...
    predicate = predicate.And(subpredicate.Expand());  // OK at runtime!
}

Hope this helps! : -)

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top