2010-03-26 15 views
2

I previously asked une question sur les conditions de chaînage dans Linq To Entities. Maintenant, j'utilise LinqKit et tout fonctionne bien. Je veux voir le SQL généré et après avoir lu this answer, j'utilise LinqPad.SQL généré avec PredicateBuilder, LINQPad et opérateur ANY

C'est ma déclaration:

var predProduct = PredicateBuilder.True<Product>(); 
var predColorLanguage = PredicateBuilder.True<ColorLanguage>(); 

predProduct = predProduct.And(p => p.IsComplete); 

predColorLanguage = predColorLanguage.And(c => c.IdColorEntity.Products.AsQueryable().Any(expr)); 

ColorLanguages.Where(predColorLanguage).Dump(); 

Le code fonctionne dans VS2008, compilez et produire le jeu de résultats corrects, mais LINQPad, j'ai l'erreur suivante:

NotSupportedException: The overload query operator 'Any' used is not Supported. 

Comment Je vois le SQL généré si LINQPad échoue?

EDIT

Si j'écris

var predColorLanguage = PredicateBuilder.True<ColorLanguage>(); 

predColorLanguage = predColorLanguage.And(c => c.IdColorEntity.Products.Any((p => p.IsComplete)); 

ColorLanguages.Where(predColorLanguage).Dump(); 

œuvres ... WTF?

Répondre

2

Comme vous utilisez LINQKit, vous pouvez faire ce travail en appelant Compile() sur l'expression qui alimente le EntitySet, puis appeler AsExpandable() sur la requête principale:

var predProduct = PredicateBuilder.True<Product>(); 
var predColorLanguage = PredicateBuilder.True<ColorLanguage>(); 

predProduct = predProduct.And(p => p.IsComplete); 

predColorLanguage = predColorLanguage.And (
    c => c.IdColorEntity.Products.Any(predProduct.Compile())); 

ColorLanguages.AsExpandable().Where(predColorLanguage).Dump(); 

Comme explained in the LINQKit article, la méthode Compile ne s'exécute jamais réellement: AsExpandable l'enlève et modifie l'arbre d'expression pour qu'il fonctionne avec LINQ to SQL.

+0

Le problème n'est pas dans Visual Studio, mais dans LinqPad. Dans Visual Studio, cela fonctionne sans problème. J'ai essayé votre solution sans succès. –

+0

Utilisez-vous Entity Framework? Et si oui, choisissez-vous 'Custom EF Context' lors de la connexion dans LINQPad? Si vous vous connectez directement à une base de données dans LINQPad, vous utilisez LINQ to SQL, ce qui peut expliquer la différence. –