【问题标题】:Execute nHibernate icriteria on result of other query (two distinct queries)对其他查询的结果执行 nHibernate icriteria(两个不同的查询)
【发布时间】:2013-11-27 15:14:12
【问题描述】:

有没有办法将 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 的结果)。请注意,我对第一个查询的结果有一个选择/限制,同时在第二个查询的投影中包括它的一个列。

标准是使用字符串动态生成的,以识别类。

【问题讨论】:

  • 我不熟悉 ICriteria,但不能将第一个查询用作基础或根查询,然后围绕它包装一个新的选择??
  • 也许你应该只过滤你 query0 的 department_ids 并且总数 > 3,然后在你的第二个查询中获取带有 IN 子句的部门。当 IN 列表真的很大时,来自 Ayende 的关于这个问题的好帖子:ayende.com/blog/2583/nhibernates-xml-in 以及指向 XmlIn.cs 的完整链接:code.google.com/p/hornget/source/browse/trunk/package_tree/…
  • @Kay Nelson 这正是分离标准与合并但单一查询的方法。 @jbl我仍然需要投影中的总数。而且这个解决方案只适用于这种特殊情况(例如,如果连接结束department.id=query0.id AND department.XYZ==query0.XYZ则不行)
  • 我想为您的查询创建一个视图0 并映射此视图可能是一种选择
  • 你的意思是在数据库中创建视图?这太特定于数据库了。多亏了 NHibernate,查询和应用程序仍然独立于数据库,并且不需要必须遵守特定于 db 的语法的 SQL 字符串

标签: nhibernate criteria nhibernate-criteria


【解决方案1】:

我能想到的最接近的就是公用表表达式(SQL WITH 语句)。不幸的是,NHibernate 似乎没有任何好的抽象来处理 CTE,但这是您的查询在 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-31
    • 1970-01-01
    • 1970-01-01
    • 2013-05-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多