1

我有两个表(订单、事务)和一个仅保留 OrderId 和 TransactionsId 列的 TransactionsOrders 查找表。

如果一个交易失败 (n) 次,则一个订单可以有多个交易。并且 Order 对象对交易一无所知。

我相信我将需要使用预测,因为如果该订单存在成功的交易记录,我将需要返回所有订单属性以及 Transactions 表中的两个属性(Amount 和 TransactionDate) 。下面是生成正确输出的 SQL。

   SELECT o.*, ct.TransactionDate, ct.Amount from Orders o
   LEFT OUTER JOIN 
     (SELECT * FROM CreditTransactionsOrders cto
          INNER JOIN CreditTransactions ct 
      ON ct.Id = cto.CreditTransactionId
      WHERE ct.Successful = 1) as ct 
   ON o.Id = ct.OrderId

我试图尝试创建此 QueryOver 并从 Order 对象和 Transaction 对象中投影我需要的属性,但无法正确转换此 SQL 查询。

最终结果是我需要返回所有订单,如果该订单存在成功的订单,我需要从 Transaction 对象返回金额和日期。我不确定我是否必须使用别名,但到目前为止我所有的尝试都没有成功。

4

1 回答 1

2

首先,您必须将您的 SQL 重写为对 NHibernate 更友好的状态:

SELECT o.*, ct.TransactionDate, ct.Amount from Orders o
  LEFT OUTER JOIN CreditTransactionsOrders cto 
    ON o.Id = cto.OrderId
  LEFT OUTER JOIN CreditTransactions ct 
    ON ct.Id = cto.CreditTransactionId AND ct.Successful = 1

此 SQL 将产生与原始查询相同的结果。

在 NHibernate 中,连接的附加条件可以翻译为with语句。

所以你可以使用重载接受withClause参数。因此,假设您将 Orders 和 CreditTransactions 映射为多对多。您应该关注 QueryOver。

Order o = null;
CreditTransaction ct = null;

var orders = session.QueryOver(() => o)
    .Left.JoinAlias(x => x.Transactions, () => ct, () => ct.Successful == 1)
    .List<Order>();

更新

由于您没有来自Orderto的引用Transaction,您应该恢复连接,因此您可以使用正确的连接来实现这一点。

Order o = null;
CreditTransaction ct = null;

var orders = session.QueryOver(() => ct)
    .Right.JoinAlias(x => x.Orders, () => o, () => ct.Successful == 1)
    .Select(
        x => x.TransactionDate,
        x => x.Amount,
        x => o.Id // other Order fields
    ).TransformUsing(Transformers.AliasToBean<TransactionsDto>())
    .List<TransactionsDto>();

TransactionsDto类应包含所有选定的字段。

于 2012-07-23T16:04:21.230 回答