您好我试图让所有在指定期间(必须是一年)内至少有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写单个请求。工作很长时间请帮忙。
答案 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:
可以将
IResultTransformer
应用于本机sql查询。允许它例如返回非托管实体。
sess.CreateSQLQuery("SELECT NAME, BIRTHDATE FROM CATS")
.SetResultTransformer(Transformers.AliasToBean(typeof(CatDTO)))
此查询指定:
- SQL查询字符串
- 结果转换器
上述查询将返回已实例化的CatDTO列表,并将NAME和BIRTHNAME的值注入其相应的属性或字段中。
因此,我们可以使用本机SQL SELECT语句来获取任何结果。我们甚至可以创建一些自定义DTO并让NHibernate将结果转换为它们......