Comment utiliser constructeur prédicat avec linq2sql et opérateur OR
-
01-10-2019 - |
Question
J'ai deux tables (tableau 1, TABLEAU2 - savoir i unique). Qui a un respectivement 1-à-plusieurs et une clé étrangère entre les colonnes d'identité des deux tables
Utilisation linq2sql Je suis en train de tout sélectionner TABLE1 des entrées telles que leur correspondant TABLEAU2 valeurs contient au moins 1 élément dans la liste Je passe il.
Voici quelques exemples de code que j'utilisais dans LINQPad (programme impressionnant) pour le tester mais je suis obtenir l'erreur NotSupportedException:. Surcharge non prise en charge utilisée pour l'opérateur de requête « Tous »
long[] items = { 3, 5, 8 };
var predicate = PredicateBuilder.False<TABLE2>();
foreach (long i in items)
{
long t = i;
predicate = predicate.Or(att => att.ID == t);
}
//TABLE2.Where(predicate).Dump(); //works like a charm
IQueryable query =
from t1 in TABLE1
where t1.TABLE2.AsQueryable().Any(predicate) //problem with this line
select a;
query.Dump();
UPDATE
Lors de l'utilisation LinqKit dans LINQPad ajouter la référence à LinqKit.dll, décochez la case Inclure PredicateBuilder, puis ajoutez également LinqKit sous l'onglet Espace de noms importations supplémentaires.
La solution
La solution de contournement est
- Appel AsExpandable () sur le
TABLE1
objet - Appel Compile () sur l'expression variable lorsqu'il est utilisé sur un EntitySet.
Ainsi, votre requête finale est
IQueryable query =
from t1 in TABLE1.AsExpandable()
where t1.TABLE2.Any(predicate.Compile()) //the problem should disappear
select a;