NHibernate/LINQ - 子集合上的聚合查询

标签 nhibernate linq-to-nhibernate

在我们使用 NHibernate(通过 LINQ)的应用程序中,查询子集合一直是一个反复出现的问题。我想弄清楚如何正确地做到这一点。我只是一直尝试使用 LINQ 使这个查询有效地工作,然后放弃了。有人可以帮助我了解做这样的事情的最佳方法吗?

Model: ServiceProvider
            HasMany->ServicesProvided

这里的问题是 HasMany 被映射为一个组件,所以我不能直接查询 ServicesProvided。为了后代的缘故,这是映射:
    public ServiceProviderMap()
    {
        DiscriminatorValue(ProfileType.SERVICE_PROVIDER.ID);

        HasMany(p => p.ServicesProvided)
            .Table("ServiceProvider_ServicesProvided")
            .KeyColumn("ProfileID")
            .Component(spMapping =>
            {
                spMapping.Map(service => service.ID)
                    .Not.Nullable();
            })
            .AsBag();
    }

我尝试创建的查询将返回提供的每个服务的计数集合。 IE:Service1 -> 200,Service2 -> 465,等等。

我能够使用 HQL 使查询正常工作,所以就在这里。请注意,它只返回所提供服务的 ID:
    select service.ID, count(service) 
    from ServiceProvider as profile 
    inner join profile.ServicesProvided as service 
    group by service.ID

我能够使用 LINQ 使查询“工作”,但它的表现很糟糕。这是我使用的代码(警告 - 这很丑陋)。
    Func<ServiceProvider, IEnumerable<ServicesProvided>> childSelector = sp => sp.ServicesProvided;
    var counts = this._sessionManager.GetCurrentSession().Linq<ServiceProvider>()
        .Expand("ServicesProvided")
        .SelectMany(childSelector, (t, c) => new { t = t, c = c })
        .Select(child => child.c)
        .GroupBy(sp => sp.ID)
        .Select(el => new { serviceID = el.Key, count = el.Count() });

我很想学习如何正确地做到这一点,拜托。

最佳答案

除了使用 HQL,我能想到的最优雅的解决方案是使用 Criteria 对象。以下内容将为您提供所需且开销非常低的内容:

ICriteria criteria = this._sessionManager.GetCurrentSession().CreateCriteria(typeof(ServiceProvider), "sp");

//set projections for the field and aggregate, making sure to group by the appropriate value
criteria.CreateAlias("sp.ServicesProvided", "s", JoinType.LeftOuterJoin)
   .SetProjection(Projections.ProjectionList()
      .Add(Projections.Property("s.ID"), "serviceID")
      .Add(Projections.Count("sp.ID"), "count")
      .Add(Projections.GroupProperty("s.ID")));

IList<object[]> results = criteria.List();

foreach (object[] entry in results)
{
   int id = (int)entry[0], qty = (int)entry[1];

   //Do stuff with the values
}

关于NHibernate/LINQ - 子集合上的聚合查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3322345/

相关文章:

c# - 在 Fluent NHibernate 中引用带有公式的实体

.net - 向客户端发送 Hibernate 代理类会出现哪些问题

c# - CaSTLe Windsor 多种生活方式( hibernate )

c#-4.0 - 如何为 NHibernate LINQ 语句设置超时

nHibernate - IStatelessSession 和 FetchMany 返回多个父记录

NHibernate 3CR1 : Fetching strategy problems

带有 MSMQ DTC 的 WCF - 关闭 NHibernate session

nhibernate - 代码生成是一件坏事吗?

t-sql - linq to nhibernate 中的条件行计数不起作用

nhibernate - LINQ Fluent NHIBERNATE .Contains()在QueryOver <>中不起作用,但在Query <>中起作用