2012-03-07 67 views
5

嗨,我有這樣的在NHibernate中執行自定義查詢,並映射到一個自定義的域對象

SELECT Customer.Name, sum([Load].Profit) as Profit FROM Customer INNER JOIN [Load] ON Customer.Id = [Load].CustomerId GROUP BY Customer.Name 

我需要在NHibernate中執行此查詢,並將其映射到我爲創建一個自定義域對象的查詢像這樣

public class CustomerProfit 
    { 
     public String Name; 
     public Decimal Profit; 

    } 

是否可以這樣做?以及在HQL中如何或者有可能執行這個自定義查詢?

+1

你喜歡什麼:a)在使用ResultTransformer但沒有changetracking B)的映射與自定義SQL和更多的工作,但變化的跟蹤和東西 – Firo 2012-03-07 15:18:49

+0

由於實體需求最少的工作,我想我更喜歡:-) – Sudantha 2012-03-07 15:58:13

+0

見這個答案 http://stackoverflow.com/questions/5964147/map-sql-query-to-business-object-in-nhibernate 也許對你有幫助;) – Gholamreza 2013-12-04 04:26:32

回答

14
public sealed class CustomerProfitQuery : IResultTransformer 
{ 
    public static readonly string Sql = "SELECT Customer.Name, sum([Load].Profit) as Profit FROM Customer INNER JOIN [Load] ON Customer.Id = [Load].CustomerId GROUP BY Customer.Name"; 
    public static readonly CustomerProfitQuery Transformer = new CustomerProfitQuery(); 

    // make it singleton 
    private CustomerProfitQuery() 
    { } 

    public IList TransformList(IList collection) 
    { 
     return collection; 
    } 

    public object TransformTuple(object[] tuple, string[] aliases) 
    { 
     return new CustomerProfit 
     { 
      Name = (string)tuple[0], 
      Profit = (decimal)tuple[1], 
     }; 
    } 
} 


// usage 
var customerprofits = session.CreateSQLQuery(CustomerProfitQuery.Sql) 
    .SetResultTransformer(CustomerProfitQuery.Transformer) 
    .List<CustomerProfit>() 
+1

Gr8 ...完全爲我工作.. gr8解決方案.. – 2013-05-08 09:13:26