2010-11-03 3 views
3

BigQuery en haut obtient un ensemble de produits et de tables liées imbriquées. Ensuite, j'applique le filtrage dans une tentative pauvre à un modèle de spécification. C'est le code du filtre. Il y a trois tables dans la requête, et je veux filtrer la requête du haut par la valeur imbriquée dans la requête du bas. Comme je l'ai dit, cela produit actuellement les résultats que nous voulons.Comment améliorer cette requête Linq 7 lignes qui agit comme une spécification?

Cependant, le .Contains() produit une clause SQL WHERE EXISTS() pour chacun. Nous n'en avons vraiment besoin que d'un, mais je ne sais pas comment obtenir l'ID interne à comparer avec l'ID externe.

from p in bigQuery       // Root table 
where (from pp in p.LPP      // Level 1 nested table 
     where (from pv in pp.LPV    // Level 2 nested table 
       where pv.colorid == intValue // Our filter value 
       select p.id).Contains(p.id) // Where exists 
     select p.id).Contains(p.id)   // Where exists 
select p; 

Des pensées? Cela produit une instruction SQL de 900 lignes en l'état, et nous n'avons qu'un seul filtre jusqu'à présent.

+1

900 lignes! Saint moly! – leppie

+1

Pourquoi sélectionnez-vous p.id dans la requête la plus interne? – leppie

+0

Je pensais avoir besoin de quelque chose qui pourrait se comparer à l'ensemble des ID externes. –

Répondre

3
from p in bigQuery 
where p.LPP.SelectMany(pv => pv.LVP).Any(x => x.colorid == intValue) 
select p; 

D'après ce que je peux voir, ce qui précède devrait être équivalent. S'il vous plaît essayez et inspectez le SQL généré, si vous travaillez. De toute façon, ça ne devrait pas être loin.

+0

TYVM Il a amélioré l'instruction select de 100 lignes –

Questions connexes