NHibernate:SQL查询结果映射

low*_*ign 2 .net nhibernate

我在NHibernate 3.1.0.4000(我正在使用MS SQL Server 2005数据库)中遇到SQL查询结果的问题.我有两个表:AdvertsInvestments映射到实体的表:AdvertInvestment.AdvertsInvestmentsvia InvestmentId列(和外键)连接.

为了保存查询结果,我创建了一个以下内部类:

    class InvestmentWithAdvertsCount
    {
        public Investment inv { get; set; }

        public int cnt { get; set; }
    }
Run Code Online (Sandbox Code Playgroud)

查询如下:

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>();
Run Code Online (Sandbox Code Playgroud)

当我运行此查询时,我收到一个InvestmentWithAdvertsCount具有正确填充cnt属性的实例集合,但该inv属性设置为null.我花了一些时间深入研究NHibernate源代码,似乎inv别名在某种程度上从查询中丢失了,NHibernate甚至没有尝试填充inv属性.如果我删除该.SetResultTransformer部分,我会收到一个数组列表(类型object[2]),第一个元素设置为Investmententity,第二个元素设置为相应的广告计数.您能告诉我如何更改此查询以使InvestmentWithAdvertsCount填充正确吗?或者可能有一种方法可以将此查询重写为QueryOver,Criteria或HQL(保持生成的SQL代码有效)?

对于这个问题,我会非常感激.谢谢

Die*_*hon 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();
Run Code Online (Sandbox Code Playgroud)