2011-02-26 77 views
0
CREATE TABLE [dbo].[OrderHistory](
    [RecordID] [int] IDENTITY(1,1) NOT NULL, 
    [UserID] [int] NOT NULL, /* FK to user table*/ 
    [ItemID] [int] NOT NULL, /* FK to Item table */ 
    [PurchaseDate] [datetime] NOT NULL, 
    [UnitPrice] [money] NOT NULL, 
    [Quantity] [float] NOT NULL, 
PRIMARY KEY CLUSTERED 
(
    [RecordID] ASC 
) ON [PRIMARY] 

我有一個表來保存用戶的訂單歷史記錄。我需要計算用戶每年花費的總金額。如果我直接寫SQL查詢,這是非常簡單明瞭:Nhibernate sum/groupby question

select SUM(UnitPrice * Quantity) as TotalAmount, DATEPART(yyyy, PurchaseDate) 
from OrderHistory 
where UserId = 1 
group by DATEPART(yyyy, PurchaseDate) 

計劃的對象模型是:

public class YearlySummary { 
     public virtual int Year { 
      get; 
      set; 
     } 

     public virtual decimal TotalSpent { 
      get; 
      set; 
     } 
    } 

但我怎麼能做到這一點NHibernate的?

感謝 哈迪

+0

NHibernate查詢在對象模型上工作,而不在數據庫模型上工作。你的對象模型是什麼? – 2011-02-26 21:04:45

回答

0

爲此,您可以使用LINQ。

你應該做一些如下:

從orderHistory在Session.Linq.Where(X => x.UserId = 1)組由orderHistory.PurchaseDate成克選擇新的{總金額= g.Sum( orderHistory.UnitPrice * orderHistory.Quantity)}

+0

你的意思是LinqToSql?但我必須使用NHibernate框架。我在ISession界面下找不到Linq。 – hardywang 2011-02-27 14:07:45

+0

@hardywang,LINQ到NHibernate是一個你可能想要的單獨項目。 http://ayende.com/Blog/archive/2009/07/26/nhibernate-linq-1.0-released.aspx for 2.1;不確定Nhibernate 3.0。否則,可以使用ICriteria接口以編程方式構建分組查詢,也可以使用HQL查找不太可能更改的參數(參數除外)。 – JasonTrue 2011-03-01 00:32:44

+0

@hardywang - 如果您使用NH3.0,那麼您使用.Query ,NH3.0擁有自己的LINQ提供程序,2.1擁有第三方LINQ提供程序。 – Phill 2011-03-01 02:36:02

0

如果您只需要獲取(歷史)數據,那實際上很容易。在你的映射文件使用一個公式:

<property name="TotalSpent" formula="UnitPrice * Quantity" type="Decimal" /> 

這將在查詢乘以兩個值(例如選擇單價*從OrderHistory數量),並把結果在TotalSpent財產。請注意,在持久數據之前,這不適用於瞬態對象。