5

我正在爲這個等效的sql查詢創建一個ICriteria查詢。如何爲給定的sql查詢創建條件查詢

SELECT fCustomerID, 
     ISNULL(
       (SELECT SUM(payinv.fAmount) AS Expr1 
       FROM dbo.tARPayment AS pay 
       INNER JOIN dbo.tARPaymentInvoice AS payinv ON pay.fPaymentID = payinv.fPaymentID 
       INNER JOIN dbo.tARInvoice AS inv ON payinv.fInvoiceID = inv.fARInvoiceID 
       WHERE (pay.fIsPosted = CASE pay.fPaymentType WHEN 'CM' THEN 0 WHEN 'EPD' THEN 0 ELSE 1 END) 
        AND (inv.fCustomerID <> dbo.tARCustomer.fCustomerID) 
        AND (pay.fCustomerID = dbo.tARCustomer.fCustomerID)), 0) 
FROM dbo.tARCustomer 
GROUP BY fCustomerID 

但是我不知道如何生成等價的nhibernate ICriteria查詢。

這是支付類

public partial class tARPayment 
{ 
    #region Constructor 

    /// <summary> 
    /// Initializes a new instance of the <see cref="tARPayment"/> class. 
    /// </summary> 
    public tARPayment() 
    { 
    } 

    /// <summary> 
    /// Initializes a new instance of the <see cref="tARPayment"/> class. 
    /// </summary> 
    /// <param name="fPaymentID">The fPaymentID of guid type.</param> 
    public tARPayment(System.Guid fPaymentID) 
    { 
     this.ID = fPaymentID; 
    } 
    #endregion 

    #region Properties 

    /// <summary> 
    /// Gets or sets payment id. 
    /// </summary> 
    public virtual System.Guid fPaymentID { get; set; } 

    /// <summary> 
    /// Gets or sets fCustomerID. 
    /// </summary> 
    public virtual System.Guid fCustomerID { get; set; } 

    /// <summary> 
    /// Gets or sets check number. 
    /// </summary> 
    public virtual string fCheckNumber { get; set; } 

    /// <summary> 
    /// Gets or sets amount. 
    /// </summary> 
    public virtual decimal fAmount { get; set; }  

    /// <summary> 
    /// Gets or sets customer detail. 
    /// </summary> 
    public virtual tARCustomer Customer { get; set; } 

    public virtual IList<tARPaymentInvoice> PaymentInvoices { get; set; }   

    #endregion 

    #region Methods 
    /// <summary> 
    /// partial class for payment. 
    /// </summary> 
    /// <returns>The method get code.</returns> 
    public override int GetHashCode() 
    { 
     return ID.GetHashCode(); 
    } 
    #endregion 
} 

這是一個發票類

public partial class tARInvoice 
{ 
    #region Constructor 
    /// <summary> 
    /// Initializes a new instance of the <see cref="tARInvoice"/> class. 
    /// </summary> 
    public tARInvoice() 
    { 
    } 

    /// <summary> 
    /// Initializes a new instance of the <see cref="tARInvoice"/> class. 
    /// </summary> 
    /// <param name="fARInvoiceID">The fARInvoiceID.</param> 
    public tARInvoice(System.Guid fARInvoiceID) 
    { 
     this.ID = fARInvoiceID; 
    } 

    #endregion 

    #region Properties 
    /// <summary> 
    /// Gets or sets fARInvoiceID. 
    /// </summary> 
    public virtual Guid fARInvoiceID { get; set; } 

    /// <summary> 
    /// Gets or sets fCustomerID. 
    /// </summary> 
    public virtual Guid fCustomerID { get; set; } 


    /// <summary> 
    /// Gets or sets Delivery Method. 
    /// </summary> 
    public virtual string fDeliveryMethod { get; set; } 

    /// <summary> 
    /// Gets or sets Invoice Number. 
    /// </summary> 
    public virtual int? fARInvoiceNumber { get; set; } 



    public virtual tARCustomer Customer { get; set; } 

    public virtual IList<tARPaymentInvoice> PaymentInvoices { get; set; }   

    #endregion 

    #region Methods 
    /// <summary> 
    /// retrieve Hash Code. 
    /// </summary> 
    /// <returns>The method get code.</returns> 
    public override int GetHashCode() 
    { 
     return ID.GetHashCode(); 
    } 
    #endregion 
} 

這是一個付款發票類。

public partial class tARPaymentInvoice 
{ 
    #region Constructor 
    /// <summary> 
    /// Initializes a new instance of the <see cref="tARPaymentInvoice"/> class. 
    /// </summary> 
    public tARPaymentInvoice() 
    { 
    } 

    /// <summary> 
    /// Initializes a new instance of the <see cref="tARPaymentInvoice"/> class. 
    /// </summary> 
    /// <param name="fPaymentInvoiceID">The Invoice ID.</param> 
    public tARPaymentInvoice(System.Guid fPaymentInvoiceID) 
    { 
     this.ID = fPaymentInvoiceID; 
    } 
    #endregion 

    #region Properties 
    /// <summary> 
    /// Gets or sets fPaymentInvoiceID. 
    /// </summary> 
    public virtual System.Guid fPaymentInvoiceID { get; set; } 

    /// <summary> 
    /// Gets or sets fPaymentID. 
    /// </summary> 
    public virtual System.Guid fPaymentID { get; set; } 

    /// <summary> 
    /// Gets or sets fInvoiceID. 
    /// </summary> 
    public virtual System.Guid fInvoiceID { get; set; }   


    /// <summary> 
    /// Gets or sets tARPayment. 
    /// </summary> 
    public virtual tARPayment Payment { get; set; } 

    /// <summary> 
    /// Gets or sets tARInvoice. 
    /// </summary> 
    public virtual tARInvoice Invoice { get; set; } 

    #endregion 

    #region Methods 
    /// <summary> 
    /// get hash codes. 
    /// </summary>   
    /// <returns>The hash code.</returns> 
    public override int GetHashCode() 
    { 
     return ID.GetHashCode(); 
    } 
    #endregion 
} 
+0

我已經更新了示例類。 – Awadhendra

+0

你有什麼進展嗎?專門使用Criteria API而非HQL或LINQ是否很重要? –

+0

不,我沒有得到任何成功。我們可以使用HQL,但不確定HQL對於所有數據庫是相同的還是哪一個更好 – Awadhendra

回答

0

而不是轉換上述查詢,以LINQ或HQL,我建議使查詢轉換爲視圖,然後使用NHibernate來查詢視圖。

SQL

CREATE VIEW vCustomerAmount AS 
SELECT fCustomerID, 
     ISNULL(
       (SELECT SUM(payinv.fAmount) AS Expr1 
       FROM dbo.tARPayment AS pay 
       INNER JOIN dbo.tARPaymentInvoice AS payinv ON pay.fPaymentID = payinv.fPaymentID 
       INNER JOIN dbo.tARInvoice AS inv ON payinv.fInvoiceID = inv.fARInvoiceID 
       WHERE (pay.fIsPosted = CASE pay.fPaymentType WHEN 'CM' THEN 0 WHEN 'EPD' THEN 0 ELSE 1 END) 
        AND (inv.fCustomerID <> dbo.tARCustomer.fCustomerID) 
        AND (pay.fCustomerID = dbo.tARCustomer.fCustomerID)), 0) [Amount] 
FROM dbo.tARCustomer 
GROUP BY fCustomerID 

C#DTO

public class CustomerAmount 
{ 
    public int fCustomerID { get; set; } 
    public decimal Amount { get; set; } 
} 

查詢

List<CustomerAmount> customerAmounts = session.Query<CustomerAmount>().ToList(); 
0

不知道有關NHibernate的,但做這個重寫的查詢有助於得到相同的答案,並且可以更容易地運行?

SELECT T.fCustomerID, 
     coalesce(SUM(payinv.fAmount), 0) as SumAmt 
    FROM 
     dbo.tARCustomer T 
     JOIN dbo.tARPayment AS pay 
      ON T.fCustomerID = pay.fCustomerID 
      AND pay.fIsPosted = CASE pay.fPaymentType 
           WHEN 'CM' THEN 0 
           WHEN 'EPD' THEN 0 
           ELSE 1 END 
      JOIN dbo.tARPaymentInvoice AS payinv 
       ON pay.fPaymentID = payinv.fPaymentID 
       INNER JOIN dbo.tARInvoice AS inv 
        ON payinv.fInvoiceID = inv.fARInvoiceID 
       AND inv.fCustomerID <> T.fCustomerID 
    GROUP BY 
     T.fCustomerID