2013-11-27 12 views
5

Esiste un modo per utilizzare un risultato ICriteria come "base" per una successiva query di criteri?Esegui nHibernate icriteria sul risultato di un'altra query (due query distinte)

Per esempio se mi piacerebbe creare una query

SELECT department_id, sum(cost) AS total 
FROM payment 
GROUP BY payment.department_id 

memorizzare il risultato come query0, e quindi eseguire la query

SELECT department.name, total 
FROM department, query0 
JOIN LEFT ON department.id=query0.id 
WHERE total > 3 

Non voglio avere un unico enorme di query eseguita tutto in una volta (che sarebbe il risultato della creazione di un ICriteria con sottoquery). Nota che ho una selezione/restrizione su un risultato della prima query e allo stesso tempo includo una delle sue colonne nella proiezione della seconda query.

Il criterio viene generato dinamicamente utilizzando le stringhe per identificare le classi.

+1

Im non familir con ICriteria, ma couldnt la prima query serve come base o rootquery e quindi avvolge una nuova selezione attorno ad essa ?? –

+1

Forse dovresti semplicemente filtrare department_ids della tua query0 con un totale> 3 e poi ottenere i departements con una clausola IN nella tua seconda query. Bel post da Ayende su questo problema quando la lista IN è veramente grande: http://ayende.com/blog/2583/nhibernates-xml-in così come un link non interrotto a XmlIn.cs: http: // code. google.com/p/hornget/source/browse/trunk/package_tree/frameworks/rhino.tools/rhino/patch/commons/Rhino.Commons.NHibernate/NHibernate/XmlIn.cs?spec=svn78&r=78 – jbl

+1

@Kay Nelson Questo è esattamente l'approccio dei criteri separati con una query unita ma singola. @ jbl Avrei ancora bisogno del totale nella proiezione. E questa soluzione funzionerebbe solo in questo caso particolare (es. Non se il join è finito 'department.id = query0.id AND department.XYZ == query0.XYZ') – Dani

risposta

1

La cosa più vicina a cui riesco a pensare è un'espressione di tabella comune (la dichiarazione SQL WITH). Purtroppo NHibernate non sembra avere buone astrazioni per trattare con CTE, ma qui è come la vostra richiesta potrebbe apparire in SQL Server:

WITH query0 AS (
    SELECT department_id AS id, sum(cost) AS total 
    FROM payment 
    GROUP BY payment.department_id 
) 
SELECT department.name, total 
FROM department, query0 
WHERE department.id=query0.id 
AND total > 3; 

SQL Fiddle: http://sqlfiddle.com/#!3/8e6877/7