nhibernate查询其他查询结果

时间:2015-04-07 10:13:24

标签: sql nhibernate queryover

您好我试图让所有在指定期间(必须是一年)内至少有6个月付款的用户。我编写的SQL工作正常,但我很难将其转换为nhibernate。

SQL:

SELECT COUNT(UserId) AS paidMonthsCount, UserId FROM (
    SELECT DISTINCT UserId,
            YEAR(PayDate) as _year,
            MONTH(PayDate) as _month
    FROM Payments
    WHERE PayDate >= '2014-04-02T00:00:00' AND PayDate < '2015-04-02T23:59:00'
)result GROUP BY result.UserId

我已经转换了内部SQL:

var subQuery = Session.QueryOver(() => paymentAlias)
                    .SelectList(list => list
                                        .Select(Projections.Distinct(Projections.Property<VelferdPayment>(p => p.Client.Id)).WithAlias(() => userWithHelp.Id))
                                        .Select(p => p.AssignmentYear).WithAlias(() => userWithHelp.AssignmentDate)
                               )
                    .WhereRestrictionOn(p => p.AssignmentDate)
                    .IsBetween(parameters.FromDate)
                    .And(parameters.ToDate);

选择不同的部分,我有另一部分从结果中选择:

var query = Session.QueryOver(() => userWithHelp).
                    SelectList(list => list
                                       .SelectCount(p=> p.Id).WithAlias(()=> userWithHelpCount.Count)
                                       .SelectGroup(p => p.Id).WithAlias(() => userWithHelpCount.Id)

                               )
                   .TransformUsing(Transformers.AliasToBean<UserWithHelpCount>())
                   .List<UserWithHelpCount>();

如何查询子查询结果或是否可以向SQL写单个请求。工作很长时间请帮忙。

1 个答案:

答案 0 :(得分:0)

通常,对于NHibernate,我们只能(或主要)查询实体,而不是TABLES。换句话说,我们首先将表或视图甚至一些<subselect>映射到实体中。以下User (C#对象User

的映射
<class name="user" table="[dbo].[user_table]" ...

允许我们通过C#User创建查询。

session.QueryOver<User>()...

在场景后面会生成FROM子句,其中包含table属性的内容,即FROM [dbo].[user_table]

就是这样。没有其他方法可以设置生成的FROM子句。只是通过映射。

但有一种方法可以让我们使用现有的ADO.NET连接来创建自定义查询,甚至将其结果转换为某个实体或DTO。它是CreateSQLQuery() API:

17.1.5. Returning non-managed entities

  

可以将IResultTransformer应用于本机sql查询。允许它例如返回非托管实体。

sess.CreateSQLQuery("SELECT NAME, BIRTHDATE FROM CATS")
    .SetResultTransformer(Transformers.AliasToBean(typeof(CatDTO)))
  

此查询指定:

     
      
  • SQL查询字符串
  •   
  • 结果转换器
  •   
     

上述查询将返回已实例化的CatDTO列表,并将NAME和BIRTHNAME的值注入其相应的属性或字段中。

因此,我们可以使用本机SQL SELECT语句来获取任何结果。我们甚至可以创建一些自定义DTO并让NHibernate将结果转换为它们......