Question

J'utilise le PredicateBuilder comme indiqué ici http://www.albahari.com/nutshell/predicatebuilder .aspx , tout fonctionne très bien et je peux maintenant générer des expressions dynamiques LINQ to SQL, mais la chose que je ne comprends pas, c’est pourquoi, quand je suis dans une boucle comme celle-ci:

var inner = PredicateBuilder.False<MyType>();
foreach (var f in Filtermodel.InstrumentsFilterList.Where(s => s.isActive))
        {
          int temp = f.InstrumentID;
          inner = inner.Or(ud => ud.InstrumentId == temp);
        }

Pourquoi dois-je utiliser cette variable temporaire?, j’essaie d’utiliser le "f" variable itérateur, mais il ne récupère que la dernière valeur de la liste pour chaque itération, comme si elle était passée par référence ...

Était-ce utile?

La solution

Parce que PredicateBuilder construit une expression qui sera exécutée ultérieurement. Lorsque le compilateur génère la fermeture pour le délégué, il recherche toutes les valeurs créées dans l'étendue actuelle et les intègre également dans la fermeture. Comme InstrumentID est un type de valeur (int), initialiser et copier la valeur signifie que chaque délégué / fermeture portera cette valeur avec lui. Si vous ne créez pas une copie de la valeur à chaque fois, l'expression aura simplement une référence littérale à f.InstrumentID, pas à sa valeur sous-jacente. Donc, plus tard, quand l’expression est réellement exécutée, f.InstrumentID est évalué et il sortira comme quoi qu’il ait été défini en dernier, à savoir la dernière itération.

Autres conseils

Parce qu'il ne s'agit pas d'évaluer la condition, mais simplement de construire l'expression. L'expression se lie à la variable définie dans foreach, qui conserve sa référence tout au long de l'exécution de la boucle entière. La redéfinir avec une variable temporaire oblige chaque expression à utiliser une variable différente, ce qui l'oblige à faire référence à l'instance avec la valeur à chaque itération plutôt que de faire en sorte que toutes les itérations se rapportent à la référence unique et aient la valeur de la dernière itération. / p>

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