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 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 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 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

進歩しましたか? HQLやLINQとは対照的にCriteria APIを特に使用することは重要ですか? –

+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; } 
} 

クエリ、NHibernateはおよそ

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

わからないけどやりますこのリライトされたクエリは同じ答えを得るのに役立ち、より簡単に実行できるものですか?

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 
関連する問題