使用 NHibernate 在单独的 SELECT 中急切地获取多个嵌套集合

本文关键字:获取 集合 嵌套 NHibernate 单独 SELECT 使用 | 更新日期: 2023-09-27 18:36:05

我有以下数据库结构,我需要完全遍历以生成报告。

Product -> ProductVariation -> ProductMedaItem
Product -> CategoryLinks -> Category

我对Products表有一个查询,并希望预取上述数据,因为我将一起访问它们。我想避免使用 JOIN,因为组合会爆炸并导致数据加载。

在我看来,理想的解决方案如下:

  • 发出查询以加载所有匹配的产品
  • 然后,根据类似于 ' Select * from ProductVariations where ProductId in ([all_product_id_set]) 的查询解析结果集,并一起加载所有产品变体;
  • 同样,将分析此结果集,并使用类似于 Select * from ProductMediaItem where ProductVariationId in ([all_product_variation_id_set]); 的查询获取所有ProductMediaItem
  • 等等等等

这将导致每个不同的关联产生一个SELECT。因此,要加载所有产品变体、其媒体项和每个产品类别链接及其各自的类别,将导致 5 SELECT 秒。

我试过使用criteria.SetFetchMode("ProductVariations", FetchMode.Select"),但这没有任何作用。我目前的解决方法是使用批处理,但这仍然会导致大约 50 - 60 个查询来获取所有数据,虽然不是那么慢,但我认为它可以做得更快。

我使用的是最新版本的NHibernate-3.3。

更新 1

我想使用普通 OOP 遍历集合,例如:

foreach (var p in Products)
{
    foreach (var variation in p.ProductVariations)
    {
        foreach (var mediaItem in variation.MediaItems)
        {
              ...
        }
    }
}

使用 NHibernate 在单独的 SELECT 中急切地获取多个嵌套集合

MultiQuery 和 MultiCriteria 将起作用,或者更容易的是期货,例如:

var productVariations = session.CreateQuery(
        "Select * from ProductVariations where ProductId in ([all_product_id_set])")
        .Future<ProductVariations>();
var mediaItems = session.CreateQuery(
        "select pv.MediaItems from ProductVariations pv where pv.ProductId in ([all_product_id_set])")
        .Future<ProductMediaItem>();

等。。。当您枚举其中任何一个时,它将在 1 次执行所有查询,唯一的"技巧"是将关系从产品向下导航到您想要选择的各种项目