2011-02-26 78 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财产。请注意,在持久数据之前,这不适用于瞬态对象。