2013-11-27 77 views
5

有没有办法将ICriteria结果用作后续条件查询的“基础”?对其他查询的结果执行nHibernate icriteria(两个不同的查询)

例如,如果我想创建一个查询

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

存储结果为query0,然后执行查询

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

我不希望有一个单一的巨大的查询执行一次(这将是创建带有子查询的ICriteria的结果)。请注意,我对第一个查询的结果有一个选择/限制,同时在第二个查询的投影中包含其中一列。

使用字符串来动态生成标准来标识类。

+1

我不是用的ICriteria familir,但不可能第一个查询作为基础或rootquery,然后在它周围包围一个新的选择? –

+1

也许你应该只用总数> 3来过滤query0的department_ids,然后在第二个查询中用IN子句获取这些部分。来自Ayende的关于这个问题的好消息,当IN列表非常大时:http://ayende.com/blog/2583/nhibernates-xml-in以及一个到XmlIn.cs的非断开链接:http://代码。 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 This恰恰是分离条件与合并但单个查询的方法。 @jbl我仍然需要投影中的总数。而这个解决方案只会在这种特殊情况下工作(例如,如果连接不在'department.id = query0.id AND department.XYZ == query0.XYZ') – Dani

回答

1

我能想到的最接近的是Common Table Expression(SQL WITH语句)。不幸的是NHibernate的似乎并不有什么好的抽象对付热膨胀系数,但这里是你的查询可能怎么看在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小提琴:http://sqlfiddle.com/#!3/8e6877/7

相关问题