我正在处理将旧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)相同的结果?
在此先感谢您的帮助。
_“一种实现与子查询相同结果的方法”_ >>你的意思是非SQL子查询,换句话说,是代码中的动态查询吗? – Abel
@Abel,我想摆脱公式属性,并在可能的情况下使用子查询(QueryOver)。 – LeftyX
请记住,每行都执行公式,并且没有延迟加载。因此对于大型数据集来说性能会很糟糕 –