2010-04-22 13 views
2

J'ai deux tables (TABLE1, TABLE2 - unique je sais) qui ont une relation 1-à-plusieurs respectivement et une clé étrangère entre les colonnes ID des deux tables.Comment utiliser le générateur de prédicat avec linq2sql et opérateur

En utilisant linq2sql Je suis en train de sélectionner toutes les entrées TABLE1 telles que leur valeurs TABLEAU2 correspondant contient au moins 1 élément dans la liste que je transmets.

Voici quelques exemples de code que j'utilisais dans LINQPad (programme impressionnant) pour le tester je suis cependant obtenir l'erreur NotSupportedException: surcharge non prise en charge utilisée pour l'opérateur de requête « Tout ».

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(); 

MISE À JOUR

Lorsque vous utilisez LinqKit dans LINQPad ajouter la référence à LinqKit.dll, décocher Inclure PredicateBuilder puis ajoutez également LinqKit sous onglet Importations supplémentaires Namespace.

+0

J'ai trouvé une question similaire ici http://stackoverflow.com/questions/2522079/generated-sql-with-predicatebuilder-linqpad-and-operator-any. N'a pas testé dans VS, mais il semble que cela puisse être un problème avec la façon dont je l'écris dans LINQPad. – David

Répondre

2

La solution est

  1. appel AsExpandable() sur l'objet TABLE1
  2. appel Compile() sur la variable expression , 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; 

Plus d'informations here.