2009-10-25 6 views
0

J'ai 3 tables:ActiveRecord requête (Château, Performance)

  • Pièces: Name: Nom interne, Active: bool
  • Langues: liste des langues (anglais, français, allemand , ....)
  • PartsTranslations: RealName et ID des 2 autres tables.

Je voudrais obtenir une liste des pièces me dire les name internes, active état et combien de traductions sont manquantes (total des traductions Soustraire lang faites)

J'ai fait cette requête SQL me donne ce que je dois (je ne sais pas si cela est la meilleure façon de le faire ou non, mais ça fonctionne):

SELECT 
    parts1.name, 
    parts1.active, 
    (
     (SELECT count(lang.id) 
      FROM languages AS lang) 
     - 
     (SELECT count(trans.id) 
      FROM parts AS parts2 
      INNER JOIN partstranslations as trans 
      ON parts2.id = trans.partid 
      WHERE parts2.id = parts1.id)   
    ) 
from parts as parts1; 

1º question- Comment puis-je faire cette requête en utilisant Castle ActiveRecord?

2º question- Comment est la performance de la requête finale (cher)?

Merci

+0

Vous pouvez utiliser Linq avec Castle ActiveRecord si c'est une option utile pour vous. –

Répondre

0

J'ai pu faire cette requête dans ActiveRecord en utilisant HqlBasedQuery , donc je poste ici la réponse pour aider les autres dans la même situation que moi.

HqlBasedQuery query = new HqlBasedQuery(typeof(Part), 
@" 
    SELECT      
     par.Id, 
     par.Name, 
     par.Active,           
     (SELECT count(*) - count(trans) FROM Language)                
    FROM Part par 
     LEFT JOIN par.PartsTranslations trans 
    GROUP BY par.Id, par.Name, par.Active, trans.Part 
    "); 
query.SetQueryRange(startId, currentPageSize); 

var results = from object[] summary in 
       (ArrayList)ActiveRecordMediator.ExecuteQuery(query) 
      select new PartProjection 
      { 
       Id = (int)summary[0], 
       Name = (string)summary[1], 
       Active = (bool)summary[2], 
       TransMissing = (long)summary[3]          
      }; 

J'ai aussi fait sur cette pagination requête et il me donne aussi un PartProjection stronged tapé des objets. Cette classe n'a pas besoin d'avoir de paramètre ActiveRecord.

-1

Je ne peux pas aider à ActiveRecord, mais cette requête doit effectuer mieux que celui avec une sous-requête corrélée.

SELECT 
    p.name, 
    p.active, 
    (SELECT count(*) FROM languages) - count(pt.divid) 
FROM 
    Parts p 
    LEFT JOIN PartsTranslations pt ON p.id=pt.divid 
GROUP BY p.id, p.name, p.active 

Ou, si vous souhaitez utiliser la sous-requête corrélative, vous n'avez pas besoin de sélectionner de nouveau dans Parts:

SELECT 
    p.name, 
    p.active, 
    (SELECT count(*) FROM Languages) - 
    (SELECT count(*) FROM PartsTranslations WHERE divid = p.id)    
FROM Parts p; 
+0

Votre deuxième requête fonctionne mais je ne peux pas exécuter la première: S ----> La colonne 'p.name' n'est pas valide dans la liste de sélection car elle n'est contenue ni dans une fonction d'agrégat ni dans la clause GROUP BY. Comment puis-je le faire fonctionner? – Dryadwoods

+0

Ajout dans: GROUP BY p.id, p.name, p.active ça marche :) Maintenant il suffit de savoir comment lancer ceci dans activeecord: P Merci Lukas – Dryadwoods

Questions connexes