2013-11-27 25 views
5

Sonraki ölçüt sorgusu için bir 'temel' olarak bir ICriteria sonucunu kullanmanın bir yolu var mı? Örneğin Diğer sorgu sonucu nHibernate icriteria çalıştır (iki farklı sorgu)

Ben

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

Ben tek büyük sorgu idam olmasını istemiyoruz sorgu query0 gibi bir sorgu

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

depolamak sonuç oluşturmak ve sonra yürütmek isterseniz

hepsi bir kerede (bu alt sorgularla bir ICriteria oluşturmanın sonucudur). İlk sorgu sonucu ve aynı zamanda ikinci sorgudaki projeksiyondaki sütunlarından birini içeren bir seçim/kısıtlama olduğumu unutmayın.

Kriterler, sınıfları tanımlamak için dizeler kullanılarak dinamik olarak oluşturulur.

+1

Im ICriteria ile familir değil, ama edemedim Maalesef NHibernate burada CTEs başa çıkmak için herhangi bir iyi soyutlamalar var gibi görünüyor, ama değil sorgu, SQL Server böyle görünebilir İlk sorgu taban veya rootquery olarak hizmet eder ve etrafına yeni bir seçim yapar mı? –

+1

Belki de sorgunuzun bölüm_dizimlerini0 toplam> 3 ile filtrelemeli ve ardından ikinci sorgudaki bir IN yan tümcesiyle bölümleri almalısınız. IN list gerçekten büyük olduğunda bu konu hakkında Ayende güzel posta: http://ayende.com/blog/2583/nhibernates-xml-in yanı sıra XmlIn.cs: http: // kodu için bozuk bir bağlantı. 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 Bu Birleştirilmiş, ancak tek bir sorgu ile ayrılan kriterlerin tam olarak bir yaklaşımdır. Jbl hala projeksiyonda toplama ihtiyacım var. Ve bu çözüm sadece bu özel durumda çalışacaktır (örneğin, birleşimin "departman.id = query0.id VE departman.XYZ == query0.XYZ" üzerinde değilse) – Dani

cevap

1

Bunu düşünebileceğim en yakın şey, Ortak Tablo İfadesi'dir (SQL WITH bildirimi).

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