【问题标题】:nhibernate multicriteria CTE subquerynhibernate 多条件 CTE 子查询
【发布时间】:2023-04-07 02:39:01
【问题描述】:

我目前有一个 MultiCriteria 查询,它根据子查询中的 id 过滤结果

Subqueries.PropertyIn("Id", detachedCriteria)

子查询对于多条件查询中使用的所有查询都是相同的。

查看重复子查询的sql似乎有点难看,在我目前的情况下重复了15次。

单独查询的原因是每个查询都有不同的连接,并且不想要一个大规模的笛卡尔连接。

如果我是手动编写 sql,我会将重复的子查询提取到一个公用表表达式中

WITH XYZ AS
{
    ....
}

然后子查询将是 15 个查询中 XYZ 中的 id。

这有点特定于 sql server,替代方法是临时表或其他数据库特定功能。

关于如何改进查询的任何想法,或者我是否坚持使用重复的子查询?

【问题讨论】:

    标签: sql-server nhibernate criteria-api


    【解决方案1】:

    好吧,如果您要返回多个结果集,那么使用 WITH 无论如何也无济于事,因为它只能应用于单个 SELECT 语句。

    无论如何,为了使数据层代码与数据库无关,我可能会将实际的查询逻辑放入存储过程中。这意味着您可以使用特定于引擎的功能进城,因为它都隐藏在公共界面后面。是的,您必须为您支持的每个数据库引擎(通常很少)重新实现查询,但是您可以完全控制在每个引擎上运行的内容,并且您的数据访问代码将变得更加简洁.

    【讨论】:

    • 感谢您的信息,在阅读了您的建议后发现这篇文章证实了您所说的。 singingeels.com/Articles/Understanding_SQL_Complex_Queries.aspx "需要注意的一点是,一个 CTE 只能在您的查询中使用一次。所以您不能在顶部声明您的 CTE,然后针对它执行多个查询。但是,您可以创建多个 CTE,然后使用它们一起在一个查询中。此外,一切都有它的位置,所以如果您发现您正在为不同的报告/查询多次构建相同的 CTE,那么您可能希望将其转换为 VIEW。"
    • 就我而言,我无法创建存储过程,就像动态查询一样。并且为每个动态查询创建一个视图会更慢,吃掉事务日志(可以放在另一个具有简单恢复模式的链接数据库中)。很高兴知道 CTE 在我的情况下对我没有帮助。
    • @Ian:你可以使用存储过程。只需将 NHibernate 查询中使用的所有输入参数传递给它。如果有很多参数或事物列表(例如 id),您可以考虑将参数作为 XML 传递。
    • 我正在使用 NHibernate 生成的动态 sql,这是一个非常复杂的查询和许多可选过滤器。每个查询可以不同。所以就我而言,我不能使用存储过程。我知道 NHibernate 支持存储过程,并且在存储过程中你可以使用动态 sql。
    猜你喜欢
    • 2011-06-09
    • 1970-01-01
    • 2011-03-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-30
    • 1970-01-01
    相关资源
    最近更新 更多