我在NHibernate 3.1.0.4000(我正在使用MS SQL Server 2005数据库)中遇到SQL查询结果的问题。我有两个表:Adverts
和Investments
,它们映射到实体:Advert
和Investment
。 Adverts
通过Investments
列(和外键)与InvestmentId
相关联。
为了保存查询结果,我创建了一个以下内部类:
class InvestmentWithAdvertsCount
{
public Investment inv { get; set; }
public int cnt { get; set; }
}
,查询如下:
var investementsWithAdvertCounts = _session.CreateSQLQuery(
"select {inv.*}, (select count(1) from Adverts where InvestmentId = inv.Id) cnt from Investments inv")
.AddScalar("cnt", NHibernateUtil.Int32)
.AddEntity("inv", typeof(Investment))
.SetResultTransformer(NHibernate.Transform.Transformers.AliasToBean(typeof(InvestmentWithAdvertsCount)))
.List<InvestmentWithAdvertsCount>();
当我运行此查询时,我收到一组InvestmentWithAdvertsCount
个实例,这些实例具有正确填充的cnt
属性,但inv
属性设置为null
。我花了一些时间深入研究NHibernate源代码,似乎 inv 别名在某种程度上从查询中丢失了,NHibernate甚至没有尝试填充inv
属性。如果我删除.SetResultTransformer
部分,我会收到一个数组列表(类型为object[2]
),第一个元素设置为Investment
实体,第二个元素设置为相应的广告计数。您能告诉我如何更改此查询以正确填充InvestmentWithAdvertsCount
吗?或者也许有办法将此查询重写为QueryOver,Criteria或HQL(保持生成的SQL代码有效)?
对于这个问题的任何帮助,我都会非常感激。感谢
答案 0 :(得分:10)
这是一种干净的方法,使用非常简单的LINQ to对象处理结果:
session.CreateSQLQuery(
"select {inv.*}, (select count(1) ... inv")
.AddScalar("cnt", NHibernateUtil.Int32)
.AddEntity("inv", typeof(Investment))
.List<object[]>()
.Select(x => new InvestmentWithAdvertsCount {inv = x[0], cnt = x[1]})
.ToList();