2010-07-08 86 views
1

我现在有一个多标准查询,该过滤器基础上的ID是一个子查询NHibernate的多标准CTE子查询

Subqueries.PropertyIn("Id", detachedCriteria)

子查询中的结果是在多标准查询中使用的所有查询相同。

看起来有点难看的子查询重复的SQL,在我目前的情况下15次。

单独查询的原因是每个人都有不同的连接,并且不希望进行一次大规模的笛卡尔连接。

如果我手写的sql我会退出经重复子查询到一个共同的表表达式

WITH XYZ AS 
{ 
    .... 
} 

,然后将子查询是其中id在XYZ在15个查询。

这是一个特定于SQL Server的服务器,替代方案是临时表或其他特定于数据库的功能。

任何想法如何改善查询,或者我坚持与子查询被复制?

回答

1

那么,如果您要返回多个结果集,那么使用WITH将无济于事,因为它只能应用于单个SELECT声明。

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

+0

感谢您的信息,阅读您的建议后发现此文章确认您的评论。 http://www.singingeels.com/Articles/Understanding_SQL_Complex_Queries.aspx“有一点需要注意的是CTE只能在查询中使用一次,所以你不能在最上面声明你的CTE,然后做多个查询但是,您可以创建多个CTE,然后在一个查询中一起使用它们,并且所有事情都有它的位置,所以如果您发现多次为不同的报告/查询构建相同的CTE,那么您可能需要转向而不是进入VIEW。“ – Ian 2010-11-15 09:08:05

+0

在我的情况下,我无法像创建动态查询那样创建存储过程。为每个动态查询创建一个视图将会变得更慢,吞噬事务日志(可以使用简单的恢复模式放入另一个链接的数据库)。无论如何,CTE不会帮助我。 – Ian 2010-11-15 09:15:11

+0

@Ian:您*可以*使用存储过程。只需传递你在NHibernate查询中使用的所有输入参数即可。如果它有很多参数或事物列表(例如,ID),则可以考虑将参数作为XML传递。 – 2010-11-15 17:49:20