5

我对 NHibernate 3.1.0.4000 中的 SQL 查询结果有疑问(我使用的是 MS SQL Server 2005 数据库)。我有两个表:Advertsand Investments,它们映射到实体:Advertand InvestmentAdverts通过列(和外键)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 代码高效)?

对于这个问题的任何帮助,我将非常感激。谢谢

4

1 回答 1

14

这是一种干净的方法,使用非常简单的 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();
于 2012-08-09T13:27:25.467 回答