NHibernate GroupBy,使用select聚合关系集合

时间:2014-10-30 17:52:52

标签: c# nhibernate

我使用NHibernate 4.0.0.4000和linq提供程序,我尝试编写这样的查询:

var jsonResult = queryable
                .GroupBy(boughtInfo => new {boughtInfo.SoldByAdministrator.UserName})
                .Select(group => new object[]
                {
                   group.Key,
                   group.Count(),
                   group.Sum(x => x.Payments.Count),
                   group.Sum(x => x.Payments.Sum(payment => payment.PaymentValue))
               })
               .Skip(itemsToSkipCount)
               .Take(itemsToTake)
               .ToList();

但是我得到了HibernateException

  • 其他信息:无法识别查询来源: ItemName = payment,ItemType = ... BoughtServicePayment,Expression = 来自[x] .Payments
  • 中的BoughtServicePayment付款

组值是类型集合:BoughtServiceInformation,其中包含ICollection<BoughtServicePayment> Payments(在HasMany处与BoughtServiceInformation映射)。我做错了什么?

1 个答案:

答案 0 :(得分:1)

如果删除分组,可以这样做:

ISessionFactory factory = SessionFactory.CreateSessionFactory();
        ISession session = factory.OpenSession();

        var res = session.Query<Client>()
            .Select(
                x => new object[]{
                    x.Transactions.Count(),
                    x.Transactions.Sum( y => y.SomeAmount),
                }
            )
            .ToList();

root将由Aministrator(SoldByAdministrator)提供。你甚至可以使用像x.Transactions.Where这样的Where子句(y =&gt; y.DSFS == 32424).Count()。

生成的sql将包含子查询,这在我的意见中是可以的。

如果您对性能不满意,那么您仍然可以使用QueryOver,它比LINQ更接近数据库操作。