2011-08-05 66 views
4

我正在处理将旧App移植到Nhibernate。
旧的应用程序广泛使用ORACLE包,我想摆脱这一点。
我已经开始绘制几张桌子,事情似乎很好。
现在,我有了这个查询,我希望能够通过QueryOver管理...或者类似的东西:提取订单和订单行使用子查询计数

SELECT 
    Orders.* 
    (SELECT COUNT(*) FROM OrderLines 
     WHERE OrderLines.CompanyCode = Orders.CompanyCode 
       AND OrderLines.OrderNumber = Orders.OrderNumber 
       AND NOT (OrderLines.OCLSCOM = 'Y' AND OrderLines.OCLSSEQ = 0) 
       AND OrderLines.Status = 'R') OrderLinesCount 
    FROM 
     Orders 
    WHERE 
     AND Orders.CompanyCode = [CompanyCode]; 

[企业编码]是一个过滤器。

我得映射文件(订单和OrderLines)和我的联想是这样的:

<class name="Order" table="Orders"> 
    ... 
    <set name="OrderLines" access="field.pascalcase-underscore" inverse="true" lazy="extra" cascade="none"> 
     <key> 
     <column name="OrderNumber" not-null="true"/> 
     <column name="CompanyCode" not-null="true"/> 
     </key> 
     <one-to-many class="OrderLine" not-found ="ignore"/> 
    </set> 
</class> 

我的订单表的主键是企业编码ORDERNUMBER

我想查询订单并获取每个订单的行数。

我已经达到了我想要添加的次序来映射一个公式属性(感谢Ayende为):

<property name="OrderLinesCount" formula="(SELECT COUNT(*) FROM OrderLines WHERE OrderLines.CompanyCode = CompanyCode AND OrderLines.OrderNumber = OrderNumber AND NOT (OrderLines.OCLSCOM = 'Y' AND OrderLines.OCLSSEQ = 0) AND OrderLines.Status = 'R')" /> 

,但我很害怕我的客户可能会决定有一天改变那些讨厌的过滤器和我将被迫重新编译整个项目。

有没有办法实现与子查询(QueryOver)相同的结果?

在此先感谢您的帮助。

+0

_“一种实现与子查询相同结果的方法”_ >>你的意思是非SQL子查询,换句话说,是代码中的动态查询吗? – Abel

+0

@Abel,我想摆脱公式属性,并在可能的情况下使用子查询(QueryOver)。 – LeftyX

+0

请记住,每行都执行公式,并且没有延迟加载。因此对于大型数据集来说性能会很糟糕 –

回答

0

最后我已经决定去的公式属性:

<property name="OrderLinesCount" formula="(SELECT COUNT(*) FROM OrderLines WHERE OrderLines.CompanyCode = CompanyCode AND OrderLines.OrderNumber = OrderNumber AND NOT (OrderLines.OCLSCOM = 'Y' AND OrderLines.OCLSSEQ = 0) AND OrderLines.Status = 'R')" /> 

有一天,如果我需要更改过滤器我可能认为使用nHibernate过滤器。

1

可能不是你正在寻找的东西,但你有没有考虑收集的where子句。您可以拨打order.OrderLinesFiltered.Count来获取值

<set name="OrderLinesFiltered" table="OrderLines" 
access="field.pascalcase-underscore" inverse="true" lazy="extra" 
cascade="none" 
where=" NOT (OCLSCOM = 'Y' AND OCLSSEQ = 0) AND Status = 'R' "> 
    <key> 
    <column name="OrderNumber" not-null="true"/> 
    <column name="CompanyCode" not-null="true"/> 
    </key> 
    <one-to-many class="OrderLine" not-found ="ignore"/> 
</set> 
+0

是的,我知道它会被执行的每一行,但我要过滤的数据集,所以我从来没有超过几行。你的想法是一个好主意,但我期待着一些不同的原因,正如我所说的,我的客户可能会要求我有一天以不同的方式过滤。 – LeftyX